XDL Manual

XDL VideoView 활용 다섯번째

(piXoneer XDL Tutorial)

 

 

 

 

 

 

이 문서는 XDL Development Library

 설치 및 사용하기 위한 문서입니다.

 

2017. 01.

 

 

목차

XDL VideoView 활용 다섯번째... 1

1    사용하기... 1

1.1    참조항목 추가... 1

1.2    센서 모델 파라미터 얻어오기... 1

 

 

 

 

1     사용하기

본 튜터리얼을 공부하기 전에 먼저 XDL VideoView 활용 네번째를 먼저 선행하시기 바랍니다. XDL VideoView 활용 네번째에 이어서 진행합니다.

1.1    참조항목 추가

1.1.1     참조 항목을 통해 “C:\Pixoneer\XDL1.2\bin\” 에 존재하는 “XDLsm.dll”을 추가한다.

 

1.1.2     센서모델 인터페이스를 위해 NSM, 화면 텍스트 프린트를 위해NGR Namespace를 추가한다.

using Pixoneer.NXDL;
using Pixoneer.NXDL.NXVideo;
using Pixoneer.NXDL.NSM;
using Pixoneer.NXDL.NGR;

 

1.2    센서 모델 파라미터 얻어오기

1.2.1     센서 정보를 도시하기 위해 XTextPrinter를 선언한다.

private XVideoIO m_videoIO = null;        // 동영상의 입출력을 담당할 객체 선언
private VideoState VS;                    // 비디오 상태를 관리하는 객체 선언

private System.Threading.Timer m_timer;         // 재생 컨트롤 바 동작을 위한 타이머
private object m_lockCurFrame = new object();   // 재생 컨트롤 바와의 동기화를 위한 Lock 객체

private XTextPrinter textPrinter = null;        // 텍스트를 화면에 뿌리기 위한 객체 선언

 

1.2.2     Form1생성자에 XTextPrinter의 객체 생성 및 초기화를 수행한다.

public Form1()
{
    InitializeComponent();
    m_videoIO = new XVideoIO(); // VideoIO를 생성
    
    VideoInit();
    nxVideoLayerOverlay1.LayerVisible = true;

    // 재생 컨트롤 바 동작을 위한 타이머 생성
    m_timer = new System.Threading.Timer(timer_Tick);

    // 타이머 옵션 변경
    m_timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);


    // TextPrinter 객체 생성
    this.textPrinter = new XTextPrinter();
    Font font = new Font("arial", 8, FontStyle.Bold);
    this.textPrinter.Initialize(font);
}

 

1.2.3     nxVideoLayerOverlay1_OnOrthoRender함수에서 센서모델 정보를 추출한다.

 

// PTS값을 얻기 위해 OnOrthoRender함수를 이용한다.
private bool nxVideoLayerOverlay1_OnOrthoRender(NXVideoLayer sender, NXVideoDrawArgs DrawArgs)
{
    try
    {
        lock (m_lockCurFrame)
        {
            // 현재 재생중인 화면의 PTS(Presentation TimeStamp) 값 얻어오기
            Int64 pts = DrawArgs.PTS;

            // PTS를 이용한 현재 재생중인 화면의 프레임 위치를 얻어오기
            VS.currentFrame = VS.videoChannel.PtsToFrameNumber(pts);
            if (VS.currentFrame >= VS.totalFrame) VS.currentFrame = VS.totalFrame;
            if (VS.currentFrame < 0) VS.currentFrame = 0;

            // 센서 모델링 정보 얻기
            XFrameSensorParams sensor_params = DrawArgs.FrameSensor.GetModelParams();
            if (sensor_params != null)
            {

                XVertex3d[] ptArr = new XVertex3d[5] { new XVertex3d(), new XVertex3d(), new XVertex3d(), new XVertex3d(), new XVertex3d() };

                double fy = (double)DrawArgs.MetadFrame.FrameHeight / 2.0 / Math.Tan(Math.PI * 31 / 180.0);
                sensor_params.FocalLength = fy;
                XFrameSensor sensor = new XFrameSensor();
                sensor.SetParamsEarth(sensor_params);

                // 비디오 영상의 모서리 1
                sensor.ImageToWorldG(new XVertex2d(0, 0), 0.0, out ptArr[0]);
                // 비디오 영상의 모서리 2
                sensor.ImageToWorldG(new XVertex2d(0, sensor_params.Height - 1), 0.0, out ptArr[1]);
                // 비디오 영상의 모서리 3
                sensor.ImageToWorldG(new XVertex2d(sensor_params.Width - 1, sensor_params.Height - 1), 0.0, out ptArr[2]);
                // 비디오 영상의 모서리 4
                sensor.ImageToWorldG(new XVertex2d(sensor_params.Width - 1, 0), 0.0, out ptArr[3]);
                // 비디오 영상의 모서리 센터
                sensor.ImageToWorldG(new XVertex2d(sensor_params.Width / 2, sensor_params.Height / 2), 0.0, out ptArr[4]);

                // UAV 촬영 센서의 자세를 얻는다.
                XVertex3d uav = DrawArgs.FrameSensor.GetModelParams().SensorPos;
                double yaw = DrawArgs.FrameSensor.GetModelParams().SensorYaw.deg;
                double pitch = DrawArgs.FrameSensor.GetModelParams().SensorPitch.deg;
                double roll = DrawArgs.FrameSensor.GetModelParams().SensorRoll.deg;

                // UAV 위치를 ECEF좌표계로부터 Geographic Coordiante로 변환시킨다.
                XGeoPoint geouav = XGeoPoint.FromEcr(uav.x, uav.y, uav.z);

                uav.x = geouav.lond;
                uav.y = geouav.latd;
                uav.z = geouav.hgt;

                // UAV의 위치와 센서의 자세, 그리고 비디오 Foot Print를 화면에 도시한다.
                string text = string.Empty;

                text = string.Format("UAV Position : {0:000.0000000} {1:00.0000000} {2}", uav.x, uav.y, uav.z);
                textPrinter.Print(text, new XVertex3d(10, 14, 0), eTextAlign.Align_Left, Color.Yellow, true, Color.Black);

                text = string.Format("UAV Attitude : {0:###.0000000} {1:###.0000000} {2:###.0000000 }", yaw, pitch, roll);
                textPrinter.Print(text, new XVertex3d(10, 28, 0), eTextAlign.Align_Left, Color.Yellow, true, Color.Black);

                for (int i = 0; i < 4; i++)
                {
                    text = string.Format("Video Corner {0} :{1:000.0000000} {2:00.0000000} {3:###.000000}", i+1, ptArr[i].x, ptArr[i].y, ptArr[i].z);
                    textPrinter.Print(text, new XVertex3d(10, 38 + 10 * (i + 1), 0), eTextAlign.Align_Left, Color.Yellow, true, Color.Black);
                }

                text = string.Format("Video Center    :{0:000.0000000} {1:00.0000000} {2:###.000000}", ptArr[4].x, ptArr[4].y, ptArr[4].z);
                textPrinter.Print(text, new XVertex3d(10, 88, 0), eTextAlign.Align_Left, Color.Yellow, true, Color.Black);
            }
            else
            {
                string text = string.Empty;
                text = string.Format("No Metadata");
                textPrinter.Print(text, new XVertex3d(10, 14, 0), eTextAlign.Align_Left, Color.Yellow, true, Color.Black);
                return true;
            }
        }
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex);	
    }
    return default(bool);
}

 

 

1.2.4     [F5]키를 눌러 프로그램을 실행시킨다. 화면 좌 상단에 센서 정보 및 동영상의 FootPrint가 도시됨을 알수 있다. 이 기능은 동영상이 MPEG2TS인 파일이 스트리밍으로 MISB표준 프로토콜로 메타데이터를 포함하고 있을경우에만 가능하다. 특히 군용 무인기의 경우 NATO STANAG 표준으로 정의된 동영상 표준 포맷의 경우 지원이 가능하다.