WPF - XDL Tutorial

XDL VideoView È°¿ë ³×¹ø°

(piXoneer XDL Tutorial)

 

 

 

 

 

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

µ¿¿µ»óÀ» È®´ë/Ãà¼Ò, È­¸é Áß½ÉÀ̵¿, ¹à±âÁ¶Àý, ȸÀü, Flip,

´Ù¾çÇÑ ÇÊÅÍÀû¿ë, È­¸é ĸÃĸ¦ ±¸ÇöÇغ¾´Ï´Ù.

 

 

2019. 04..

 

 

¸ñÂ÷

XDL VideoView È°¿ë ³×¹ø°... 1

1    »ç¿ëÇϱâ... 1

1.1    ¸Þ´º »ý¼ºÇϱâ... 1

1.2    ¸Þ´º¿¡ ´ëÇÑ ±â´É ±¸Çö... 1

 

 

 

 

1     »ç¿ëÇϱâ

º» Æ©Å͸®¾óÀ» °øºÎÇϱâ Àü¿¡ ¸ÕÀú ¡°XDL VideoView È°¿ë ¼¼¹ø°¡±¸¦ ¸ÕÀú ¼±ÇàÇϽñ⠹ٶø´Ï´Ù. XDL VideoView È°¿ë ¼¼¹ø°¿¡ À̾ ÁøÇàÇÕ´Ï´Ù.

1.1    ¸Þ´º »ý¼ºÇϱâ

1.1.1     ±âº»À¸·Î »ý¼ºµÈ Grid¸¦ µÎ °³ÀÇ Row·Î ³ª´« ÈÄ, ù ¹ø° Cell¿¡ Menu¸¦ ¹èÄ¡ÇÏ°í MenuItem Ç׸ñÀ» Ãß°¡ÇÏ¿© [File]°ú [Open]À» »ý¼ºÇÑ´Ù. (ÀÚ¼¼ÇÑ ¸Þ´º»ý¼º¿¡ ´ëÇÑ ¼³¸íÀº XDL_VideoView1 TutorialÀ» Âü°íÇÑ´Ù.)  

 

1.1.2     À̾ ¿À¸¥ÂÊ ¹öÆ°À» ´­·¯ MenuItemÃß°¡¸¦ ÇÑ´Ù. Â÷·Ê·Î [View], [Enhance], [Rotate], [Flip], [Shift], [Algor], [Capture]¸¦ Ãß°¡·Î »ý¼ºÇÑ´Ù.

 

 

1.1.3     [View]-[ZoomIn(+)], [View]-[ZoomOut(-)] ±â´ÉÀ» Ãß°¡ÇÑ´Ù. [ZoomIn(+)], [ZoomOut(-)] Àº ºñµð¿ÀÀÇ ºä È­¸éÀ» ¡°È®´ë¡±½ÃÅ°°Å³ª ¡°Ãà¼Ò¡±½ÃÅ°´Â ±â´ÉÀ» ´ã´çÇÑ´Ù.

 

 

¾Æ·¡ Ç¥¸¦ Âü°íÇÏ¿© ¸Þ´º¸¦ »ý¼ºÇÑ´Ù.

 

Control Type

Header

Name

MenuItem

_View

 

MenuItem

_ZoomIn(+)

zoomInViewMenuItem

MenuItem

_ZoomOut(-)

zoomOutViewMenuItem

 

 

1.1.4     [Enhance]-[Contrast], [Enhance]-[Brightness], [Enhance]-[Gamma] ±â´ÉÀ» Ãß°¡ÇÑ´Ù. ¡°Contrast¡±, ¡°Brightness¡±Àº °¢°¢ÀÇ ¡°Contrast¡±³ª ¡°Brightness¡±°ªÀ» º¯°æ½ÃÅ°°í, ¡°Gamma¡±´Â ¡°Gamma¡±ÀÇ À妽º¸¦ º¯È­½ÃÄѼ­ È­¸éÀÇ ¹à±â¸¦ Á¶ÀýÇÏ´Â ±â´ÉÀ» ´ã´çÇÑ´Ù.

 

 

¾Æ·¡ Ç¥¸¦ Âü°íÇÏ¿© ¸Þ´º¸¦ »ý¼ºÇÑ´Ù.

 

Control Type

Header

Name

MenuItem

_Enhance

 

MenuItem

_Constant 0.2+

constant02EnhanceMenuItem

MenuItem

_Constant 0.2-

constant02Enhance2MenuItem

MenuItem

_Brightness 0.2+

brightness02EnhanceMenuItem

MenuItem

_Brightness 0.2-

brightness02Enhance2MenuItem

MenuItem

_Gamma 0.4

gamma04EnhanceMenuItem

MenuItem

_Gamma 1.0

gamma10EnhanceMenuItem

MenuItem

_Gamma 1.5

gamma15EnhanceMenuItem

MenuItem

_Gamma 2.2

gamma22EnhanceMenuItem

MenuItem

_Gamma 4.0

gamma40EnhanceMenuItem

 

 

1.1.5     [Rotate] ±â´ÉÀ» Ãß°¡ÇÑ´Ù. ¡°Rotate¡±±â´ÉÀº È­¸éÀÇ È¸ÀüÀ» Á¶ÀýÇÏ´Â ±â´ÉÀ» ´ã´çÇÑ´Ù.

 

 

¾Æ·¡ÀÇ Ç¥¸¦ Âü°íÇÏ¿© ¸Þ´º¸¦ »ý¼ºÇÑ´Ù.

 

Control Type

Header

Name

MenuItem

_Rotate

 

MenuItem

_Rotate +45

rotate45RotateMenuItem

MenuItem

_Rotate -45

rotate45Rotate2MenuItem

MenuItem

_Rotate 0

rotate0RotateMenuItem

 

1.1.6     [Flip]-[VFlip], [Flip]-[HFlip] ±â´ÉÀ» Ãß°¡ÇÑ´Ù. ¡°Flip¡±±â´ÉÀº È­¸éÀÇ ÁÂ/¿ì(HFlip)³ª »ó/ÇÏ(VFlip) ¸¦ µÚÁý¾î¼­ µµ½ÃÇÏ´Â ±â´ÉÀ» ´ã´çÇÑ´Ù.

 

 

¾Æ·¡ÀÇ Ç¥¸¦ Âü°íÇÏ¿© ¸Þ´º¸¦ »ý¼ºÇÑ´Ù.

 

Control Type

Header

Name

MenuItem

_Flip

 

MenuItem

_VFlip

vfilpFilpMenuItem

MenuItem

_HFlip

hfilpFilpMenuItem

 

 

1.1.7     [Shift] ±â´ÉÀ» Ãß°¡ÇÑ´Ù. ¡°Shift¡± ±â´ÉÀº È­¸éÀ» ƯÁ¤ °ª¸¸Å­ À̵¿½ÃÅ°´Â ±â´ÉÀ» ´ã´çÇÑ´Ù.

 

 

Control Type

Header

Name

MenuItem

_Shift

 

MenuItem

_Shift +200, +200

shift200ShiftMenuItem

MenuItem

_Shift -200, -200

shift200Shift2MenuItem

MenuItem

_Shift 0, 0

shift0ShiftMenuItem

 

1.1.8     [Algorithm] ±â´ÉÀ» Ãß°¡ÇÑ´Ù.  ¡°Algorithm¡±±â´ÉÀº µµ½ÃµÇ´Â µ¿¿µ»ó¿¡ ´Ù¾çÇÑ ÇÊÅͱâ´ÉÀ» Àû¿ëÇÏ´Â ±â´ÉÀ» ´ã´çÇÑ´Ù. [Edge Detection], [HDR, Basso], [Median], [Average]ÇÊÅ͸¦ ±¸¼ºÇÑ´Ù.

 

 

¾Æ·¡ÀÇ Ç¥¸¦ Âü°íÇÏ¿© ¸Þ´º¸¦ »ý¼ºÇÑ´Ù.

 

Control Type

Header

Name

MenuItem

_Algor

 

MenuItem

_Edge Detection

edgedetetionAlgorMenuItem

MenuItem

_HDR

hdrAlgorMenuItem

MenuItem

_Basso

bassoAlgorMenuItem

MenuItem

_Median

medianAlgorMenuItem

MenuItem

_Average

averageAlgorMenuItem

MenuItem

_Disable

disableAlgorMenuItem

 

1.1.9     [Capture] ±â´ÉÀ» Ãß°¡ÇÑ´Ù. ÇöÀç µµ½ÃµÇ´Â Frame°ú ºñµð¿ÀÀÇ Ã¹¹ø° FrameÀ» ĸÃÄÇؼ­ ÀúÀåÇÏ´Â ±â´ÉÀ» ±¸ÇöÇÑ´Ù.

 

 

¾Æ·¡ÀÇ Ç¥¸¦ Âü°íÇÏ¿© ¸Þ´º¸¦ »ý¼ºÇÑ´Ù.

 

Control Type

Header

Name

MenuItem

_Capture

 

MenuItem

_SaveCurrentFrame

saveCurrentFrameCaptureMenuItem

MenuItem

_SaveFrame_FirstFrame

saveFrame_FirstFrameCaptureMenuItem

 

1.2    ¸Þ´º¿¡ ´ëÇÑ ±â´É ±¸Çö

1.2.1     ¡°View¡±¿¡ ´ëÇÑ ±â´ÉÀ» ±¸ÇöÇÑ´Ù. ºñµð¿À¿¡ ´ëÇÑ È­¸é È®´ë/Ãà¼Ò¿¡ ´ëÇÑ ±â´ÉÀ» ±¸ÇöÇÑ´Ù.

// ZoomIn ¸Þ´º ¾ÆÀÌÅÛ Å¬¸¯ ½Ã È£ÃâµÇ´Â À̺¥Æ® ÇÔ¼ö
private void zoomInViewMenuItem_Click(object sender, RoutedEventArgs e)
{
      XVertex2d VideoScale = nxVideoView1.Scale;

      if (VideoScale.x > 0)
      {
         if (VideoScale.x >= 2.0) return;
      }
      else
      {
         if (VideoScale.x <= -2.0) return;
      }

      if (VideoScale.y > 0)
      {
         if (VideoScale.y >= 2.0) return;
      }

      else
      {
         if (VideoScale.y <= -2.0) return;
      }

      if (VideoScale.x > 0) VideoScale.x += 0.2; else VideoScale.x -= 0.2;
      if (VideoScale.y > 0) VideoScale.y += 0.2; else VideoScale.y -= 0.2;

      nxVideoView1.Scale = VideoScale;
}

// ZoomOut ¸Þ´º ¾ÆÀÌÅÛ Å¬¸¯½Ã È£ÃâµÇ´Â À̺¥Æ® ÇÔ¼ö
private void zoomOutViewMenuItem_Click(object sender, RoutedEventArgs e)
{
       XVertex2d VideoScale = nxVideoView1.Scale;

      if (VideoScale.x > 0)
      {
          if (VideoScale.x < 0.5) return;
      }
      else
      {
          if (VideoScale.x > -0.5) return;
      }

      if (VideoScale.y > 0)
      {
          if (VideoScale.y < 0.5) return;
      }
      else
      {
          if (VideoScale.y > -0.5) return;
      }

      if (VideoScale.x > 0) VideoScale.x -= 0.2; else VideoScale.x += 0.2;
      if (VideoScale.y > 0) VideoScale.y -= 0.2; else VideoScale.y += 0.2;

      nxVideoView1.Scale = VideoScale;
}

 

1.2.2     ¡°Rotate¡±¿¡ ´ëÇÑ ±â´ÉÀ» ±¸ÇöÇÑ´Ù.

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ È­¸éÀ» ȸÀü(45µµ)
private void rotate45RotateMenuItem_Click(object sender, RoutedEventArgs e)
{
      nxVideoView1.Rotation = new XAngle(45);
}

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ È­¸éÀ» ȸÀü(-45µµ)
private void rotate45Rotate2MenuItem_Click(object sender, RoutedEventArgs e)
{
      nxVideoView1.Rotation = new XAngle(-45);
}

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ È­¸éÀ» ȸÀü(0µµ)
private void rotate0RotateMenuItem_Click(object sender, RoutedEventArgs e)
{
      nxVideoView1.Rotation = new XAngle(0);
}

 

1.2.3     ¡°Enhance¡±¿¡ ´ëÇÑ ±â´ÉÀ» ±¸ÇöÇÑ´Ù. ºñµð¿À¿¡ ´ëÇÑ È­¸é ¹à±â Á¶Àý¿¡ ´ëÇÑ ±â´ÉÀ» ±¸ÇöÇÑ´Ù.

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ Contrast Á¶Àý
private void constrast02EnhanceMenuItem_Click(object sender, RoutedEventArgs e)
{
     nxVideoView1.FilterType = eVideoFilterType.CBS;
     nxVideoView1.Contrast += 0.2f;
}

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ Contrast Á¶Àý
private void constrast02Enhance2MenuItem_Click(object sender, RoutedEventArgs e)
{
      nxVideoView1.FilterType = eVideoFilterType.CBS;
      nxVideoView1.Contrast -= 0.2f;
}

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ Brightness Á¶Àý
private void brightness02EnhanceMenuItem_Click(object sender, RoutedEventArgs e)
{
      nxVideoView1.FilterType = eVideoFilterType.CBS;
      nxVideoView1.Brightness += 0.2f;
}

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ Brightness Á¶Àý
private void brightness02Enhance2MenuItem_Click(object sender, RoutedEventArgs e)
{
      nxVideoView1.FilterType = eVideoFilterType.CBS;
      nxVideoView1.Brightness -= 0.2f;
}

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ Gamma Á¶Àý
private void gamma04EnhanceMenuItem_Click(object sender, RoutedEventArgs e)
{
nxVideoView1.FilterType = eVideoFilterType.Gamma;
      nxVideoView1.GammaFactor = 0.4f;
}

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ Gamma Á¶Àý
private void gamma10EnhanceMenuItem_Click(object sender, RoutedEventArgs e)
{
       nxVideoView1.FilterType = eVideoFilterType.Gamma;
       nxVideoView1.GammaFactor = 1.0f;
 }

 // Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ Gamma Á¶Àý
private void gamma15EnhanceMenuItem_Click(object sender, RoutedEventArgs e)
{
       nxVideoView1.FilterType = eVideoFilterType.Gamma;
       nxVideoView1.GammaFactor = 1.5f;
}

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ Gamma Á¶Àý
private void gamma22EnhanceMenuItem_Click(object sender, RoutedEventArgs e)
{
       nxVideoView1.FilterType = eVideoFilterType.Gamma;
       nxVideoView1.GammaFactor = 2.2f;
}

// Àç»ýµÇ°í ÀÖ´Â µ¿¿µ»óÀÇ Gamma Á¶Àý
private void gamma40EnhanceMenuItem_Click(object sender, RoutedEventArgs e)
{
       nxVideoView1.FilterType = eVideoFilterType.Gamma;
       nxVideoView1.GammaFactor = 4.0f;
}

 

1.2.4     ¡°Flip¡±¿¡ ´ëÇÑ ±â´ÉÀ» ±¸ÇöÇÑ´Ù.

// µ¿¿µ»ó È­¸éÀ» ¼öÁ÷ ¹æÇâÀ¸·Î Flip
private void vflipFilpMenuItem_Click(object sender, RoutedEventArgs e)
{
    nxVideoView1.Scale = new XVertex2d(nxVideoView1.Scale.x, nxVideoView1.Scale.y * -1);
}

// µ¿¿µ»ó È­¸éÀ» ¼öÆò ¹æÇâÀ¸·Î Flip
private void HflipFilpMenuItem_Click(object sender, RoutedEventArgs e)
{
    nxVideoView1.Scale = new XVertex2d(nxVideoView1.Scale.x * -1, nxVideoView1.Scale.y);
}

 

1.2.5     ¡°ºñµð¿À È­¸é ¿µ¿ª À̵¿(Shift)¡± ´ëÇÑ ±â´ÉÀ» ±¸ÇöÇÑ´Ù.

private void shift200ShiftMenuItem_Click(object sender, RoutedEventArgs e)
{
      nxVideoView1.Translation = new XVertex2d(200, 200);
}

private void shift200Shift2MenuItem_Click(object sender, RoutedEventArgs e)
{
      nxVideoView1.Translation = new XVertex2d(-200, -200);
}

private void shift0ShiftMenuItem_Click(object sender, RoutedEventArgs e)
{
      nxVideoView1.Translation = new XVertex2d(0, 0);
}

 

1.2.6     ¡°ºñµð¿À ¿µ»ó󸮡± ´ëÇÑ ±â´ÉÀ» ±¸ÇöÇÑ´Ù.

private void edgeDetectionAlgorMenuItem_Click(object sender, RoutedEventArgs e)
{
      // Edge ÇÊÅ͸¦ ¼³Á¤
      nxVideoView1.FilterType = eVideoFilterType.Edge;
}

private void hdrAlgorMenuItem_Click(object sender, RoutedEventArgs e)
{ 
      // HDR ÇÊÅ͸¦ ¼³Á¤
      nxVideoView1.FilterType = eVideoFilterType.HDR;
}

 private void bassoAlgorMenuItem_Click(object sender, RoutedEventArgs e)
{ 
       // Basso ÇÊÅ͸¦ ¼³Á¤
       nxVideoView1.FilterType = eVideoFilterType.Basso;
}

private void medianAlgorMenuItem_Click(object sender, RoutedEventArgs e)
{
       // ÅëÇØ Median ÇÊÅ͸¦ ¼³Á¤
       nxVideoView1.FilterType = eVideoFilterType.Median;
}

private void averageAlgorMenuItem_Click(object sender, RoutedEventArgs e)
{
       // Average ÇÊÅ͸¦ ¼³Á¤
       nxVideoView1.FilterType = eVideoFilterType.Average;
}

private void diableAlgorMenuItem_Click(object sender, RoutedEventArgs e)
{
       // ÇÊÅÍ ¼³Á¤ ÇØÁ¦
       nxVideoView1.FilterType = eVideoFilterType.None;
}

 

1.2.7     ¡°ºñµð¿À È­¸é ĸÃÄ¡±¿¡ ´ëÇÑ ±â´ÉÀ» ±¸ÇöÇÑ´Ù.

// µµ½ÃµÇ°í ÀÖ´Â ÇöÀç ÇÁ·¹ÀÓÀ» ÀúÀåÇÑ´Ù.
private void saveCurrentFrameCaptureMenuItem_Click(object sender, RoutedEventArgs e)
{
      if (VS.video == null)
      {
          MessageBox.Show(this, "µ¿¿µ»óÀ» ¸ÕÀú Open Çϼ¼¿ä.", "¿À·ù");
          return;
      }

// ÇÔ¼ö ÄÝ ½ÃÁ¡ÀÇ µµ½ÃµÈ ¿µ»óÀ» RGB Çü½ÄÀ¸·Î ´ã°í ÀÖ´Â XFramePicture °´Ã¼¸¦ »ý¼ºÇÏ¿© ¹Ýȯ
XFramePicture frameRGB = VS.videoChannel.GetRenderedFrameRGB();

      SaveFileDialog dlg = new SaveFileDialog();
      dlg.Title = "ÀúÀå °æ·Î¸¦ ¼³Á¤Çϼ¼¿ä";
      dlg.OverwritePrompt = true;
      dlg.Filter = "JPED File(*.jpg)|*.jpg";
         
      Nullable<bool> result = dlg.ShowDialog();
      if (result == true)
      {
          string strError;
          string strFileName = dlg.FileName;

          // XFramePicture °´Ã¼ÀÇ È­¸é ÇÁ·¹ÀÓÀ» À̹ÌÁö·Î ÀúÀå
          // ÀúÀåÀ» À§ÇÑ ÆÄÀÏ Æ÷¸ËÀ¸·Î´Â TIFF, NITF, JPEG, BMP, JPEG2000 µî Áö¿ø
          bool bres = frameRGB.SaveFrame(strFileName, "JPEG", out strError, null);

          if (!bres)
          {
              MessageBox.Show(this, "ÇÁ·¹ÀÓ ÀúÀå¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", "¿À·ù");
              return;
           }
       }
}

private void saveFrame_FirstFrameCaputreMenuItem_Click(object sender, RoutedEventArgs e)
 {
      if (VS.video == null)
      {
          MessageBox.Show(this, "µ¿¿µ»óÀ» ¸ÕÀú Open Çϼ¼¿ä.", "¿À·ù");
          return;
       }

       SaveFileDialog dlg = new SaveFileDialog();
       dlg.Title = "ÀúÀå °æ·Î¸¦ ¼³Á¤Çϼ¼¿ä";
       dlg.OverwritePrompt = true;
       dlg.Filter = "JPEG File(*.jpg)|*.jpg";

       Nullable<bool> result = dlg.ShowDialog();
       if (result == true)
       {
           string strError;
           string strFileName = dlg.FileName;

          // XVideoIO °´Ã¼¸¦ ÅëÇØ °¡Á®¿Â µ¿¿µ»ó ½ºÆ®¸²ÀÇ Ã¹¹ø° ÇÁ·¹ÀÓÀ» ¹Ýȯ
          XFramePicture frameRGB = m_videoIO.GetFirstFrameRGB(VS.videoFilePath, "XFFMPDRIVER", out strError);

          // XFramePucture °´Ã¼ÀÇ È­¸é ÇÁ·¹ÀÓÀ» À̹ÌÁö·Î ÀúÀå
          // ÀúÀåÀ» À§ÇÑ ÆÄÀÏ Æ÷¸ËÀ¸·Î´Â TIFF, NITF, JPEG, BMP, JPEG200 µî Áö¿ø
          bool bres = frameRGB.SaveFrame(strFileName, "JPEG", out strError, null);

          if (!bres)
          {
               MessageBox.Show(this, "ÇÁ·¹ÀÓ ÀúÀå¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", "¿À·ù");
               return;
          }
       }
}

1.2.8     [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇà ÈÄ [View], [Enhance], [Rotate], [Flip], [Algor], [Shift], [Capture] ´©¸£°í ÇϺΠ±â´ÉÀ» Å×½ºÆ® ÇÑ´Ù.