XDL Manual

XDL VideoView È°¿ë ´Ù¼¸¹ø°

(piXoneer XDL Tutorial)

 

 

 

 

  

 NXVideoView¸¦ È°¿ëÇÏ¿© µ¿¿µ»ó Ç÷¹À̾ ±¸ÇöÇØ º¾´Ï´Ù.

UAV¿¡¼­ ÃÔ¿µÇ쵂 µ¿¿µ»ó¿¡ FrameÁ¤º¸¿Í ÃÔ¿µ ±âÇÏ¿¡ ´ëÇÑ

¼¾¼­ ¸ðµ¨ Á¤º¸°¡ ÇÔ²² ½ºÆ®¸®¹ÖµÇ´Â MPEG2TSÆÄÀÏÀ» ÀÐ¾î µé¿©

UAV ºñÇàüÀÇ À§Ä¡, ÀÚ¼¼, ±×¸®°í µ¿¿µ»óÀÇ Foot Print¸¦

½Ç½Ã°£À¸·Î µµ½ÃÇÏ´Â ±â´ÉÀ» ±¸ÇöÇغ¾´Ï´Ù.

 

 

2017. 01.

¼öÁ¤ 2019. 02.

 

 

¸ñÂ÷

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 Ç¥ÁØÀ¸·Î Á¤ÀÇµÈ µ¿¿µ»ó Ç¥ÁØ Æ÷¸ËÀÇ °æ¿ì Áö¿øÀÌ °¡´ÉÇÏ´Ù.