700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 海康威视相机SDK开发(1个相机)

海康威视相机SDK开发(1个相机)

时间:2022-04-23 14:43:03

相关推荐

海康威视相机SDK开发(1个相机)

海康威视相机SDK开发

1. 需要的引用和命名空间2. Bayer图转彩色图并显示在自定义控件上3. 例程代码4. 资源下载地址相机型号:MV-CE050-31GC

1. 需要的引用和命名空间

文件放在exe目录下命名空间:

using ;using System.Threading;using System.Runtime.InteropServices;

2. Bayer图转彩色图并显示在自定义控件上

下面是将C# Bayer图像变量 转为halcon图像变量的方法,如果需要,可以按照下面的方式修改。这种转换会比较方便,如果拆通道会比较麻烦,这里就不介绍了。

//在pictrue控件上显示图像Invoke(new MethodInvoker(delegate (){stDisplayInfo.hWnd = pictureBox1.Handle;}));stDisplayInfo.pData = m_BufForDriver;stDisplayInfo.nDataLen = stFrameInfo.nFrameLen;stDisplayInfo.nWidth = stFrameInfo.nWidth;stDisplayInfo.nHeight = stFrameInfo.nHeight;stDisplayInfo.enPixelType = stFrameInfo.enPixelType;//m_MyCamera.MV_CC_DisplayOneFrame_NET(ref stDisplayInfo);//这里是将图像显示在picture控件上byte[] m_pImageData = new byte[(int)stDisplayInfo.nDataLen];Marshal.Copy(stDisplayInfo.pData, m_pImageData, 0, (int)stDisplayInfo.nDataLen);unsafe{fixed (byte * pImage = m_pImageData){//C# 变量转为 Halcon 图像变量HOperatorSet.GenImage1Extern(out ho_BImageBayer, "byte", stDisplayInfo.nWidth, stDisplayInfo.nHeight, new IntPtr(pImage), 0);//将Bayer图转为彩色图HOperatorSet.CfaToRgb(ho_BImageBayer, out ho_BImageRGB1, "bayer_gb", "bilinear");}}//显示try{zcHWindow1.SetImage(ho_BImageRGB1);//这里是我自己写的自定义控件,并不是Halcon自带的}catch{}

3. 例程代码

using System;using System.Windows.Forms;using ;using System.Threading;using System.Runtime.InteropServices;namespace HikCamTest{public partial class Form1 : Form{#region 变量MyCamera.MV_CC_DEVICE_INFO_LIST m_stDeviceList = new MyCamera.MV_CC_DEVICE_INFO_LIST();private MyCamera m_MyCamera = new MyCamera();bool m_bGrabbing = false;Thread m_hReceiveThread = null;MyCamera.MV_FRAME_OUT_INFO_EX m_stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();// ch:用于从驱动获取图像的缓存 | en:Buffer for getting image from driverUInt32 m_nBufSizeForDriver = 0;IntPtr m_BufForDriver;private static Object BufForDriverLock = new Object();#endregion#region 构造函数public Form1(){InitializeComponent();}#endregion#region 显示错误信息private void ShowErrorMsg(string csMessage, int nErrorNum){string errorMsg;if (nErrorNum == 0){errorMsg = csMessage;}else{errorMsg = csMessage + ": Error =" + String.Format("{0:X}", nErrorNum);}switch (nErrorNum){case MyCamera.MV_E_HANDLE: errorMsg += " Error or invalid handle "; break;case MyCamera.MV_E_SUPPORT: errorMsg += " Not supported function "; break;case MyCamera.MV_E_BUFOVER: errorMsg += " Cache is full "; break;case MyCamera.MV_E_CALLORDER: errorMsg += " Function calling order error "; break;case MyCamera.MV_E_PARAMETER: errorMsg += " Incorrect parameter "; break;case MyCamera.MV_E_RESOURCE: errorMsg += " Applying resource failed "; break;case MyCamera.MV_E_NODATA: errorMsg += " No data "; break;case MyCamera.MV_E_PRECONDITION: errorMsg += " Precondition error, or running environment changed "; break;case MyCamera.MV_E_VERSION: errorMsg += " Version mismatches "; break;case MyCamera.MV_E_NOENOUGH_BUF: errorMsg += " Insufficient memory "; break;case MyCamera.MV_E_UNKNOW: errorMsg += " Unknown error "; break;case MyCamera.MV_E_GC_GENERIC: errorMsg += " General error "; break;case MyCamera.MV_E_GC_ACCESS: errorMsg += " Node accessing condition error "; break;case MyCamera.MV_E_ACCESS_DENIED: errorMsg += " No permission "; break;case MyCamera.MV_E_BUSY: errorMsg += " Device is busy, or network disconnected "; break;case MyCamera.MV_E_NETER: errorMsg += " Network error "; break;}MessageBox.Show(errorMsg, "PROMPT");}#endregion#region 查找设备private void bnEnum_Click(object sender, EventArgs e){DeviceListAcq();}private void DeviceListAcq(){// ch:创建设备列表 | en:Create Device ListSystem.GC.Collect();cbDeviceList.Items.Clear();m_stDeviceList.nDeviceNum = 0;int nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_stDeviceList);if (0 != nRet){ShowErrorMsg("Enumerate devices fail!", 0);return;}// ch:在窗体列表中显示设备名 | en:Display device name in the form listfor (int i = 0; i < m_stDeviceList.nDeviceNum; i++){MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE){MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO));if (gigeInfo.chUserDefinedName != ""){cbDeviceList.Items.Add("GEV: " + gigeInfo.chUserDefinedName + " (" + gigeInfo.chSerialNumber + ")");}else{cbDeviceList.Items.Add("GEV: " + gigeInfo.chManufacturerName + " " + gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")");}}else if (device.nTLayerType == MyCamera.MV_USB_DEVICE){MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stUsb3VInfo, typeof(MyCamera.MV_USB3_DEVICE_INFO));if (usbInfo.chUserDefinedName != ""){cbDeviceList.Items.Add("U3V: " + usbInfo.chUserDefinedName + " (" + usbInfo.chSerialNumber + ")");}else{cbDeviceList.Items.Add("U3V: " + usbInfo.chManufacturerName + " " + usbInfo.chModelName + " (" + usbInfo.chSerialNumber + ")");}}}// ch:选择第一项 | en:Select the first itemif (m_stDeviceList.nDeviceNum != 0){cbDeviceList.SelectedIndex = 0;}}#endregion#region 打开设备private void bnOpen_Click(object sender, EventArgs e){if (m_stDeviceList.nDeviceNum == 0 || cbDeviceList.SelectedIndex == -1){ShowErrorMsg("No device, please select", 0);return;}// ch:获取选择的设备信息 | en:Get selected device informationMyCamera.MV_CC_DEVICE_INFO device =(MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[cbDeviceList.SelectedIndex],typeof(MyCamera.MV_CC_DEVICE_INFO));// ch:打开设备 | en:Open deviceif (null == m_MyCamera){m_MyCamera = new MyCamera();if (null == m_MyCamera){return;}}int nRet = m_MyCamera.MV_CC_CreateDevice_NET(ref device);if (MyCamera.MV_OK != nRet){return;}nRet = m_MyCamera.MV_CC_OpenDevice_NET();if (MyCamera.MV_OK != nRet){m_MyCamera.MV_CC_DestroyDevice_NET();ShowErrorMsg("Device open fail!", nRet);return;}// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE){int nPacketSize = m_MyCamera.MV_CC_GetOptimalPacketSize_NET();if (nPacketSize > 0){nRet = m_MyCamera.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);if (nRet != MyCamera.MV_OK){ShowErrorMsg("Set Packet Size failed!", nRet);}}else{ShowErrorMsg("Get Packet Size failed!", nPacketSize);}}// ch:设置采集连续模式 | en:Set Continues Aquisition Modem_MyCamera.MV_CC_SetEnumValue_NET("AcquisitionMode", (uint)MyCamera.MV_CAM_ACQUISITION_MODE.MV_ACQ_MODE_CONTINUOUS);m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_OFF);bnGetParam_Click(null, null);// ch:获取参数 | en:Get parameters// ch:控件操作 | en:Control operationSetCtrlWhenOpen();}private void SetCtrlWhenOpen(){bnOpen.Enabled = false;bnClose.Enabled = true;bnStartGrab.Enabled = true;bnStopGrab.Enabled = false;bnContinuesMode.Enabled = true;bnContinuesMode.Checked = true;bnTriggerMode.Enabled = true;cbSoftTrigger.Enabled = false;bnTriggerExec.Enabled = false;tbExposure.Enabled = true;tbGain.Enabled = true;tbFrameRate.Enabled = true;bnGetParam.Enabled = true;bnSetParam.Enabled = true;}#endregion#region 关闭设备private void bnClose_Click(object sender, EventArgs e){// ch:取流标志位清零 | en:Reset flow flag bitif (m_bGrabbing == true){m_bGrabbing = false;//m_hReceiveThread.Join();}if (m_BufForDriver != IntPtr.Zero){Marshal.Release(m_BufForDriver);}// ch:关闭设备 | en:Close Devicem_MyCamera.MV_CC_CloseDevice_NET();m_MyCamera.MV_CC_DestroyDevice_NET();// ch:控件操作 | en:Control OperationSetCtrlWhenClose();}private void SetCtrlWhenClose(){bnOpen.Enabled = true;bnClose.Enabled = false;bnStartGrab.Enabled = false;bnStopGrab.Enabled = false;bnContinuesMode.Enabled = false;bnTriggerMode.Enabled = false;cbSoftTrigger.Enabled = false;bnTriggerExec.Enabled = false;tbExposure.Enabled = false;tbGain.Enabled = false;tbFrameRate.Enabled = false;bnGetParam.Enabled = false;bnSetParam.Enabled = false;}#endregion#region 开始采集private void bnStartGrab_Click(object sender, EventArgs e){// ch:标志位置位true | en:Set position bit truem_bGrabbing = true;m_hReceiveThread = new Thread(ReceiveThreadProcess); m_hReceiveThread.Start();m_stFrameInfo.nFrameLen = 0;//取流之前先清除帧长度m_stFrameInfo.enPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_Undefined;// ch:开始采集 | en:Start Grabbingint nRet = m_MyCamera.MV_CC_StartGrabbing_NET();if (MyCamera.MV_OK != nRet){m_bGrabbing = false;//m_hReceiveThread.Join();ShowErrorMsg("Start Grabbing Fail!", nRet);return;}// ch:控件操作 | en:Control OperationSetCtrlWhenStartGrab();}private void SetCtrlWhenStartGrab(){bnStartGrab.Enabled = false;bnStopGrab.Enabled = true;if (bnTriggerMode.Checked && cbSoftTrigger.Checked){bnTriggerExec.Enabled = true;}}#endregion#region 采集线程public void ReceiveThreadProcess(){MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE();int nRet = m_MyCamera.MV_CC_GetIntValue_NET("PayloadSize", ref stParam);if (MyCamera.MV_OK != nRet){ShowErrorMsg("Get PayloadSize failed", nRet);return;}UInt32 nPayloadSize = stParam.nCurValue;if (nPayloadSize > m_nBufSizeForDriver){if (m_BufForDriver != IntPtr.Zero){Marshal.Release(m_BufForDriver);}m_nBufSizeForDriver = nPayloadSize;m_BufForDriver = Marshal.AllocHGlobal((Int32)m_nBufSizeForDriver);}if (m_BufForDriver == IntPtr.Zero){return;}MyCamera.MV_FRAME_OUT_INFO_EX stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();MyCamera.MV_DISPLAY_FRAME_INFO stDisplayInfo = new MyCamera.MV_DISPLAY_FRAME_INFO();while (m_bGrabbing){lock (BufForDriverLock){nRet = m_MyCamera.MV_CC_GetOneFrameTimeout_NET(m_BufForDriver, nPayloadSize, ref stFrameInfo, 1000);if (nRet == MyCamera.MV_OK){m_stFrameInfo = stFrameInfo;}}if (nRet == MyCamera.MV_OK){if (RemoveCustomPixelFormats(stFrameInfo.enPixelType)){continue;}Invoke(new MethodInvoker(delegate (){stDisplayInfo.hWnd = pictureBox1.Handle;}));stDisplayInfo.pData = m_BufForDriver;stDisplayInfo.nDataLen = stFrameInfo.nFrameLen;stDisplayInfo.nWidth = stFrameInfo.nWidth;stDisplayInfo.nHeight = stFrameInfo.nHeight;stDisplayInfo.enPixelType = stFrameInfo.enPixelType;m_MyCamera.MV_CC_DisplayOneFrame_NET(ref stDisplayInfo);}else{if (bnTriggerMode.Checked){Thread.Sleep(5);}}}}// ch:去除自定义的像素格式 | en:Remove custom pixel formatsprivate bool RemoveCustomPixelFormats(MyCamera.MvGvspPixelType enPixelFormat){Int32 nResult = ((int)enPixelFormat) & (unchecked((Int32)0x80000000));if (0x80000000 == nResult){return true;}else{return false;}}#endregion#region 停止采集private void bnStopGrab_Click(object sender, EventArgs e){// ch:标志位设为false | en:Set flag bit falsem_bGrabbing = false;//m_hReceiveThread.Join();// ch:停止采集 | en:Stop Grabbingint nRet = m_MyCamera.MV_CC_StopGrabbing_NET();if (nRet != MyCamera.MV_OK){ShowErrorMsg("Stop Grabbing Fail!", nRet);}// ch:控件操作 | en:Control OperationSetCtrlWhenStopGrab();}private void SetCtrlWhenStopGrab(){bnStartGrab.Enabled = true;bnStopGrab.Enabled = false;bnTriggerExec.Enabled = false;}#endregion#region 连续模式private void bnContinuesMode_CheckedChanged(object sender, EventArgs e){if (bnContinuesMode.Checked){m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_OFF);cbSoftTrigger.Enabled = false;bnTriggerExec.Enabled = false;}}#endregion#region 触发模式private void bnTriggerMode_CheckedChanged(object sender, EventArgs e){// ch:打开触发模式 | en:Open Trigger Modeif (bnTriggerMode.Checked){m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);// ch:触发源选择:0 - Line0; | en:Trigger source select:0 - Line0;// 1 - Line1;// 2 - Line2;// 3 - Line3;// 4 - Counter;// 7 - Software;if (cbSoftTrigger.Checked){m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);if (m_bGrabbing){bnTriggerExec.Enabled = true;}}else{m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_LINE0);}cbSoftTrigger.Enabled = true;}}#endregion#region 软触发一次private void bnTriggerExec_Click(object sender, EventArgs e){// ch:触发命令 | en:Trigger commandint nRet = m_MyCamera.MV_CC_SetCommandValue_NET("TriggerSoftware");if (MyCamera.MV_OK != nRet){ShowErrorMsg("Trigger Software Fail!", nRet);}}#endregion#region 获取参数private void bnGetParam_Click(object sender, EventArgs e){MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();int nRet = m_MyCamera.MV_CC_GetFloatValue_NET("ExposureTime", ref stParam);if (MyCamera.MV_OK == nRet){tbExposure.Text = stParam.fCurValue.ToString("F1");}nRet = m_MyCamera.MV_CC_GetFloatValue_NET("Gain", ref stParam);if (MyCamera.MV_OK == nRet){tbGain.Text = stParam.fCurValue.ToString("F1");}nRet = m_MyCamera.MV_CC_GetFloatValue_NET("ResultingFrameRate", ref stParam);if (MyCamera.MV_OK == nRet){tbFrameRate.Text = stParam.fCurValue.ToString("F1");}}#endregion#region 设置参数private void bnSetParam_Click(object sender, EventArgs e){try{float.Parse(tbExposure.Text);float.Parse(tbGain.Text);float.Parse(tbFrameRate.Text);}catch{ShowErrorMsg("Please enter correct type!", 0);return;}m_MyCamera.MV_CC_SetEnumValue_NET("ExposureAuto", 0);int nRet = m_MyCamera.MV_CC_SetFloatValue_NET("ExposureTime", float.Parse(tbExposure.Text));if (nRet != MyCamera.MV_OK){ShowErrorMsg("Set Exposure Time Fail!", nRet);}m_MyCamera.MV_CC_SetEnumValue_NET("GainAuto", 0);nRet = m_MyCamera.MV_CC_SetFloatValue_NET("Gain", float.Parse(tbGain.Text));if (nRet != MyCamera.MV_OK){ShowErrorMsg("Set Gain Fail!", nRet);}nRet = m_MyCamera.MV_CC_SetFloatValue_NET("AcquisitionFrameRate", float.Parse(tbFrameRate.Text));if (nRet != MyCamera.MV_OK){ShowErrorMsg("Set Frame Rate Fail!", nRet);}}#endregion#region 对话框关闭private void Form1_FormClosing(object sender, FormClosingEventArgs e){if (m_hReceiveThread.IsAlive){m_hReceiveThread.Abort();bnClose_Click(sender, e);}}#endregion}}

4. 资源下载地址

/download/weixin_38566632/9597?spm=1001..3001.5503

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。