close
新專案名稱: SantechCallback
開啟StCamUSBPack_EN_160325\3_SDK\StandardSDK(v3.10)\include
準備加入StCamD.cs
加入->現有項目->StCamD.cs
開啟3_SDK\StandardSDK(v3.10)\Sample\VCSHARPNET2005\SampleCallback
將CFPS.cs加入專案
加入Emgu.CV Emgu.CV.UI Emgu.Util
--------------------------------------------------------------------
加入命名空間
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範例程式
全站熱搜