WPF - XDL Tutorial

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

(piXoneer XDL Tutorial)

 

 

 

 

  

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

FrameÁ¤º¸¿Í ÃÔ¿µ ±âÇÏ¿¡ ´ëÇÑ ¼¾¼­ ¸ðµ¨ Á¤º¸°¡

ÇÔ²² ½ºÆ®¸®¹ÖµÇ´ÂMPEG2TSÆÄÀÏÀ» ÀÐ¾î µéÀÌ°í UAV ºñÇàüÀÇ À§Ä¡, ÀÚ¼¼,

 ±×¸®°í µ¿¿µ»óÀÇ Foot Print¸¦ ½Ç½Ã°£À¸·Î µµ½ÃÇÏ´Â ±â´ÉÀ» ±¸ÇöÇغ¾´Ï´Ù.

 

 

2019. 04.

 

 

¸ñÂ÷

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     MainWindow¿¡¼­ XTextPrinterÀÇ °´Ã¼ »ý¼º ¹× ÃʱâÈ­¸¦ ¼öÇàÇÑ´Ù.

public MainWindow()
{
    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, System.Drawing.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, System.Drawing.Color.Yellow, true, System.Drawing.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, System.Drawing.Color.Yellow, true, System.Drawing.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, System.Drawing.Color.Yellow, true, System.Drawing.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, System.Drawing.Color.Yellow, true, System.Drawing.Color.Black);
          }
          else
          {
              string text = string.Empty;
              text = string.Format("No Metadata");
              textPrinter.Print(text, new XVertex3d(10, 14, 0), eTextAlign.Align_Left, System.Drawing.Color.Yellow, true, System.Drawing.Color.Black);
              return true;
           }
     }
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex);	
    }
    return default(bool);
}

 

 

1.2.4     [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ´Ù. È­¸é Á »ó´Ü¿¡ ¼¾¼­ Á¤º¸ ¹× µ¿¿µ»óÀÇ FootPrint°¡ µµ½ÃµÊÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ ±â´ÉÀº µ¿¿µ»óÀÌ MPEG2TSÀÎ ÆÄÀÏÀÌ ½ºÆ®¸®¹ÖÀ¸·Î MISBÇ¥ÁØ ÇÁ·ÎÅäÄÝ·Î ¸ÞŸµ¥ÀÌÅ͸¦ Æ÷ÇÔÇÏ°í ÀÖÀ» °æ¿ì¿¡¸¸ °¡´ÉÇÏ´Ù. ƯÈ÷ ±º¿ë ¹«ÀαâÀÇ °æ¿ì NATO STANAG Ç¥ÁØÀ¸·Î Á¤ÀÇµÈ µ¿¿µ»ó Ç¥ÁØ Æ÷¸ËÀÇ °æ¿ì Áö¿øÀÌ °¡´ÉÇÏ´Ù.