close

新專案名稱: SantechCallback

image

開啟StCamUSBPack_EN_160325\3_SDK\StandardSDK(v3.10)\include

準備加入StCamD.cs

image

加入->現有項目->StCamD.cs

image

開啟3_SDK\StandardSDK(v3.10)\Sample\VCSHARPNET2005\SampleCallback

image

將CFPS.cs加入專案

加入Emgu.CV Emgu.CV.UI Emgu.Util

image

--------------------------------------------------------------------

加入命名空間

using SensorTechnology;
using SampleCallback;
using System.Runtime.InteropServices;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;

初始化Callback function物件 m_GDICallbackDelegate

public Form1()
{
    InitializeComponent();
    m_GDICallbackDelegate = new StCam.fStCamPreviewGDICallbackFunc(OnGDICallbackFunc);
}

preview 按鈕

//Start
            if (!StCam.CreatePreviewWindow(
                m_hCamera, "Preview",
                StCam.WS_CHILD | StCam.WS_VISIBLE,
                0, 0, 0, 0, tabPage3.Handle, System.IntPtr.Zero, true))
                ShowErrorMsg(StCam.GetLastError(m_hCamera));
 
            UInt32 dwStyle = StCam.WS_VISIBLE | StCam.WS_HSCROLL | StCam.WS_VSCROLL;
            dwStyle |= StCam.WS_CHILDWINDOW;
            //StCam.SetWhiteBalanceMode(m_hCamera, 0);
            whiteBalanceToolStripMenuItem.Checked = true;
            StCam.SetWhiteBalanceMode(m_hCamera, 1);
            if (!StCam.StartTransfer(m_hCamera))
                ShowErrorMsg(StCam.GetLastError(m_hCamera));

白平衡StCam我試過的心得

1. 自訂義效果最好, Auto tune效果很爛,

例如全白的待測物去校正, 但學習出來的效果往往不佳,

當你再拿其他顏色待測物就會發現白平衡參數不適用@@

2. 自訂義參數在調整階段, 建議放入四種顏色R,G, B還有全白的待測物,

這樣才不會調適過度目前顏色, 漏掉某其他顏色

Snap

private void Snap()
      {
          bool bReval = true;
          uint nLastErrorNo = 0;
 
          do
          {
              //Get Image Size
              uint dwSize;
              uint dwWidth;
              uint dwHeight;
              uint dwLinePitch;
              bReval = StCam.GetPreviewDataSize(m_hCamera, out dwSize, out dwWidth, out dwHeight, out dwLinePitch);
              if (!bReval)
              {
                  nLastErrorNo = StCam.GetLastError(m_hCamera);
                  break;
              }
 
              //Get Preview Pixel Format
              uint dwPreviewPixelFormat;
              bReval = StCam.GetPreviewPixelFormat(m_hCamera, out dwPreviewPixelFormat);
              if (!bReval)
              {
                  nLastErrorNo = StCam.GetLastError(m_hCamera);
                  break;
              }
 
              //Allocate Memory
              System.Drawing.Imaging.PixelFormat pixelFormat = System.Drawing.Imaging.PixelFormat.Format8bppIndexed;
              switch (dwPreviewPixelFormat)
              {
                  case (StCam.STCAM_PIXEL_FORMAT_24_BGR):
                      pixelFormat = System.Drawing.Imaging.PixelFormat.Format24bppRgb;
                      break;
                  case (StCam.STCAM_PIXEL_FORMAT_32_BGR):
                      pixelFormat = System.Drawing.Imaging.PixelFormat.Format32bppRgb;
                      break;
              }
 
              byte[] pbyteImageBuffer = new byte[dwSize];
 
              //Take Snap Shot
              uint dwNumberOfByteTrans;
              uint[] pdwFrameNo = new uint[1];
              uint dwMilliseconds = 100;
              System.Runtime.InteropServices.GCHandle gch = System.Runtime.InteropServices.GCHandle.Alloc(pbyteImageBuffer, System.Runtime.InteropServices.GCHandleType.Pinned);
              System.IntPtr ptr = gch.AddrOfPinnedObject();
 
              bReval = StCam.TakePreviewSnapShot(m_hCamera, ptr, dwSize, out dwNumberOfByteTrans, pdwFrameNo, dwMilliseconds);
 
              gch.Free();
              if (!bReval)
              {
                  nLastErrorNo = StCam.GetLastError(m_hCamera);
                  break;
              }
 
              UpdateSnapShot((int)dwWidth, (int)dwHeight, pbyteImageBuffer, dwSize, pixelFormat);
              //m_FormSnapShot.Show();
          } while (false);
 
          //Show Error Message
          if (!bReval)
          {
              ShowErrorMsg(nLastErrorNo);
          }
      }

UpdateSanpeShot

public bool UpdateSnapShot(int nWidth, int nHeight, byte[] pbyteImg, uint nBufferSize, System.Drawing.Imaging.PixelFormat pixelFormat)
       {
           Bitmap bitmap = new Bitmap(nWidth, nHeight, pixelFormat);
 
 
           switch (pixelFormat)
           {
               case (System.Drawing.Imaging.PixelFormat.Format8bppIndexed):
                   //Palette
                   {
 
                       System.Drawing.Imaging.ColorPalette colorPalette = bitmap.Palette;
                       for (int pixelValue = 0; pixelValue <= 255; pixelValue++)
                       {
                           colorPalette.Entries[pixelValue] = Color.FromArgb(pixelValue, pixelValue, pixelValue);
                       }
                       bitmap.Palette = colorPalette;
                   }
                   break;
           }
 
           //Copy
           System.Drawing.Imaging.BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, nWidth, nHeight), System.Drawing.Imaging.ImageLockMode.WriteOnly, pixelFormat);
           System.Runtime.InteropServices.Marshal.Copy(pbyteImg, 0, bitmapData.Scan0, (int)nBufferSize);
           bitmap.UnlockBits(bitmapData);
 
           if (m_Bitmap != null)
           {
               //pictureBox1.Image = null;
               m_Bitmap.Dispose();
               inputImage.Dispose();
           }
 
           m_Bitmap = bitmap;
 
           // 複製至inputImage (EmguCV格式)
           inputImage = new Image<Bgr, byte>(m_Bitmap);
           colorImageBox.Image = inputImage;
  
 
           return (true);
       }




參考資料

1. 原廠SampleCallback範例程式

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 me1237guy 的頭像
    me1237guy

    天天向上

    me1237guy 發表在 痞客邦 留言(0) 人氣()