海康威视相机SDK开发

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

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

  • 文件放在exe目录下
  • 命名空间:
using MvCamCtrl.NET;
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 MvCamCtrl.NET;
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. 资源下载地址

https://download.csdn.net/download/weixin_38566632/20059597?spm=1001.2014.3001.5503

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

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

    1. 示例: 直接使用了海康威视的例程代码: 单个相机 多个相机 2. 资源下载地址: https://download.csdn.net/download/weixin_38566632/20067 ...

  2. 华睿相机sdk 开发_索尼发布相机远程操作SDK(软件开发工具包)

    索尼从2020年12月9日开始,向开发者免费提供针对索尼数码相机的软件开发工具包" Camera Remote SDK" 1.03版. " Camera Remote S ...

  3. [相机开发] VC++联合相机SDK开发

    SDK的英文全名是:software development kit,翻译成中文的意思就是"软件开发工具包"通俗一点说 就是第三服务商提供的实现软件产品某项功能的开发包.里面就是动 ...

  4. DALSA网口线扫相机SDK开发详解例程(C#版)

    首先吐槽一句,官方的demos写的真的不好,坑爹啊.对于小白来说,开发官方demos为我所用太难了.为什么呢?因为它Dalsa的DALSA.SaperaLT.SapClassBasic.dll中,不仅 ...

  5. Basler相机SDK开发

    作为集成商,本着万事从官方开始的原则,先来到basler官网Basler – 德国工业相机_工业镜头_工业光源_线材等视觉组件提供商 随便找一款相机,下载Basler pylon相机软件套装,下载py ...

  6. 华睿相机sdk 开发_告别翻转腾挪,读码一步到位丨华睿科技六面读码系统

    随着制造业的智能化发展和电子商务的急剧扩张,中国物流行业正在从传统物流迈向智慧物流时代.分拣作为物流配送的重要环节,决定了整个物流运输的最终效率.如何提升物流分拣效率?华睿科技给出了答案. 华睿科技六 ...

  7. 华睿相机sdk 开发_相机SDK开发

    本人在用halcon做图像处理做视觉项目时,通常都是用c#写程序的主体架构,然后将halcon的图像处理过程嵌套进去.所以做了一个basler相机采图并用halcon显示的demo,写这篇文章用于记录 ...

  8. Dalsa线扫相机SDK开发-小试牛刀(1)

    拿到了dalsa相机,可以用Sapera软件配置相机,进行图像采集.但是自己开发的话就得撸起袖子写代码了,查了两篇不错的博文,作为指导. Sapera帮助文档 - <好好先生>专栏 - 博 ...

  9. 华睿相机sdk 开发_岳阳楼区供应睿鉑倾斜五镜头相机D2PSDK是

    岳阳楼区供应睿鉑倾斜五镜头相机D2PSDK是 优势说明:睿鉑倾斜五镜头相机D2PSDK是S2PSDK的升级版相机,具备1:500地籍免相控的能力. 分享到: 当 前 价:1.00 起订数量: 1台 发 ...

最新文章

  1. 直播 | ACL 2021论文解读:表征与结构兼备,结构化语言模型R2D2
  2. 十二届 - CSU 1803 :2016(同余定理)
  3. C++数组与指针概念
  4. 【Blog.Core开源】完成升级.NET 6.0
  5. 论文浅尝 - ECIR2021 | 两种实体对齐方法的严格评估
  6. 在maven项目中打开jsp_零基础在intellij中打开一个项目复制粘贴内容即可运行的java拼图...
  7. 如何用C#将tif格式的图片转化成jpg?
  8. 阿里合伙人名单曝光;百度网盘回应“不买会员限速”;库克:不担心苹果在华表现 | 极客头条...
  9. 我的Android进阶之旅------gt;Android中编解码学习笔记
  10. 【Python】Pycharm中plot绘图不能显示
  11. java反射用法示例_Java反射示例教程
  12. 现控笔记(三):状态空间表达式的解
  13. 电脑上怎么批量压缩图片?如何快速批量压缩图片?
  14. 图扑软件 | 数字孪生智慧选煤厂
  15. 基于边缘计算的视觉感知研究
  16. python怎么画名字_python 画中国地图怎么把省份名字加上-
  17. fastadmin 百度编辑器无法上传图片的几种原因和修改方法
  18. python 数据库框架peewee_python peewee模块使用
  19. oh-my-zsh提示符显示当前用户名和主机名
  20. 可视化脑洞|1896年以来奥运奖牌数据背后的故事

热门文章

  1. Apache与Subversion的简单配置(Apache SVN版本控制)
  2. js 省市下拉列表联动
  3. linux中 查看系统属性 与 可执行文件属性 的方法
  4. 关于DevEco Studio踩过的各种坑~
  5. WIN10安装和使用MySql5.6中遇到的一些问题与解决
  6. Appium 解决微信公众号、小程序切换 webview 后无法定位元素的问题
  7. 解决CentOS无法解析域名的问题
  8. hive:导出数据记录中null被替换为\n的解决方案
  9. 安装WampServer时出现的问题(丢失VCRUNTIME140.dll或MSVCR110.dll)以及解决办法
  10. R(1):中文乱码解决方案