最近做项目需要对海康相机进行二次开发,现将所学进行整理。
开发环境VS2012+C#(32位) Halcon12
引用动态链接库
引用Halcon动态链接库(halcondotnet.dll)
引用海康相机动态链接库(MvCameraControl.Net.dll)这个文件在MVS安装目录下MVS\Development\DotNet中,如果你是32位的开发环境就选择win32文件夹下的,如果是64位就选择win64文件夹下的
创建相机类
先在创建的类中编写方法,之后实例化相机类,调用类中的方法。
鼠标右键单击工程项目–添加–类,选择“类”,输入类的名称,例如Hikvision,点击右下角的“添加”。
首先,要引入的命名空间:using HalconDotNetusing MvCamCtrl.NET
其次,需要用到的全部变量:
private MyCamera m_pMyCamera
MyCamera.MV_CC_DEVICE_INFO_LIST m_pDeviceList//设备列表
private MyCamera.MVCC_INTVALUE stParam//用于接收特定的参数
//为读取、保存图像创建的数组
UInt32 m_nBufSizeForDriver = 3072 * 2048 * 3
byte[] m_pBufForDriver = new byte[3072 * 2048 * 3]
UInt32 m_nBufSizeForSaveImage = 3072 * 2048 * 3 * 3 + 2048
byte[] m_pBufForSaveImage = new byte[3072 * 2048 * 3 * 3 + 2048]
//要转成的Halcon图像
HImage image = new HImage()
(1) 查找设备列表
//查找设备
public void DeviceListAcq()
{
int nRet
// ch:创建设备列表 en:Create Device List
System.GC.Collect()
cbDeviceList.Items.Clear()
nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_pDeviceList)
if (0 != nRet)
{
MessageBox.Show("查找设备失败!")
return
}
// ch:在窗体列表中显示设备名 | en:Display device name in the form list
for (int i = 0i <m_pDeviceList.nDeviceNumi++)
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_pDeviceList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO))
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stGigEInfo, 0)
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_GIGE_DEVICE_INFO))
if (gigeInfo.chUserDefinedName != "")
{
cbDeviceList.Items.Add("GigE: " + gigeInfo.chUserDefinedName + " (" + gigeInfo.chSerialNumber + ")")
}
else
{
cbDeviceList.Items.Add("GigE: " + gigeInfo.chManufacturerName + " " + gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")")
}
}
else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stUsb3VInfo, 0)
MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_USB3_DEVICE_INFO))
if (usbInfo.chUserDefinedName != "")
{
cbDeviceList.Items.Add("USB: " + usbInfo.chUserDefinedName + " (" + usbInfo.chSerialNumber + ")")
}
else
{
cbDeviceList.Items.Add("USB: " + usbInfo.chManufacturerName + " " + usbInfo.chModelName + " (" + usbInfo.chSerialNumber + ")")
}
}
}
// ch:选择第一项 | en:Select the first item
if (m_pDeviceList.nDeviceNum != 0)
{
cbDeviceList.SelectedIndex = 0
}
}
(2) 打开设备
//打开设备
public void OpenDevice()
{
if (m_pDeviceList.nDeviceNum == 0 || cbDeviceList.SelectedIndex == -1)
{
MessageBox.Show("未发现设备,请选择")
return
}
int nRet = -1
// ch:获取选择的设备信息 | en:Get selected device information
MyCamera.MV_CC_DEVICE_INFO device =
(MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_pDeviceList.pDeviceInfo[cbDeviceList.SelectedIndex],
typeof(MyCamera.MV_CC_DEVICE_INFO))
// ch:打开设备 | en:Open device
if (null == m_pMyCamera)
{
m_pMyCamera = new MyCamera()
if (null == m_pMyCamera)
{
return
}
}
nRet = m_pMyCamera.MV_CC_CreateDevice_NET(ref device)
if (MyCamera.MV_OK != nRet)
{
return
}
nRet = m_pMyCamera.MV_CC_OpenDevice_NET()
if (MyCamera.MV_OK != nRet)
{
m_pMyCamera.MV_CC_DestroyDevice_NET()
MessageBox.Show("设备打开失败")
//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_pMyCamera.MV_CC_GetOptimalPacketSize_NET()
if (nPacketSize >0)
{
nRet = m_pMyCamera.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize)
if (nRet != MyCamera.MV_OK)
{
Console.WriteLine("Warning: Set Packet Size failed {0:x8}", nRet)
}
}
else
{
Console.WriteLine("Warning: Get Packet Size failed {0:x8}", nPacketSize)
}
}
// ch:设置采集连续模式 | en:Set Continues Aquisition Mode
m_pMyCamera.MV_CC_SetEnumValue_NET("AcquisitionMode", 2)// ch:工作在连续模式 | en:Acquisition On Continuous Mode
m_pMyCamera.MV_CC_SetEnumValue_NET("TriggerMode", 0) // ch:连续模式 | en:Continuous
}
(3) 连续采集
//连续采集(也就是实时显示)
public void ContinuesGrab(PictureBox picBox)
{
int nRet
// ch:开始采集 | en:Start Grabbing
nRet = m_pMyCamera.MV_CC_StartGrabbing_NET()
if (MyCamera.MV_OK != nRet)
{
MessageBox.Show("采集失败!")
//ShowErrorMsg("Trigger Fail!", nRet)
return
}
//实时采集
m_pMyCamera.MV_CC_SetEnumValue_NET("TriggerMode", 0)
// ch:显示 | en:Display 在PictureBox控件中显示
nRet = m_pMyCamera.MV_CC_Display_NET(picBox.Handle)
if (MyCamera.MV_OK != nRet)
{
MessageBox.Show("显示失败!")
}
}
(4) 停止采集
//停止采集
public void StopGrab()
{
int nRet = -1
// ch:停止采集 | en:Stop Grabbing
nRet = m_pMyCamera.MV_CC_StopGrabbing_NET()
if (nRet != MyCamera.MV_OK)
{
MessageBox.Show("停止采集失败!")
}
}
(5) 关闭设备
//关闭设备
public void CloseDevice()
{
// ch:关闭设备 | en:Close Device
int nRet
nRet = m_pMyCamera.MV_CC_CloseDevice_NET()
if (MyCamera.MV_OK != nRet)
{
return
}
nRet = m_pMyCamera.MV_CC_DestroyDevice_NET()
if (MyCamera.MV_OK != nRet)
{
return
}
}
(6) 转成Halcon图像
//读取图片转换成Halcon图像
public HImage ReadImage()
{
int nRet
//MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE()
UInt32 nPayloadSize = 0
nRet = m_pMyCamera.MV_CC_GetIntValue_NET("PayloadSize", ref stParam)
if (MyCamera.MV_OK != nRet)
{
return null
}
nPayloadSize = stParam.nCurValue
if (nPayloadSize >m_nBufSizeForDriver)
{
m_nBufSizeForDriver = nPayloadSize
m_pBufForDriver = new byte[m_nBufSizeForDriver]
m_nBufSizeForSaveImage = m_nBufSizeForDriver * 3 + 2048
m_pBufForSaveImage = new byte[m_nBufSizeForSaveImage]
}
IntPtr pData = Marshal.UnsafeAddrOfPinnedArrayElement(m_pBufForDriver, 0)
MyCamera.MV_FRAME_OUT_INFO_EX stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX()
nRet = m_pMyCamera.MV_CC_GetOneFrameTimeout_NET(pData, m_nBufSizeForDriver, ref stFrameInfo, 1000)//获取一帧图像,超时时间设置为1000
if (MyCamera.MV_OK != nRet)
{
return null
}
HImage image = new HImage()
//采集的是黑白图像,利用Halcon图像库中的GenImage1算子来构建图像
image.GenImage1("byte", (int)stFrameInfo.nWidth, (int)stFrameInfo.nHeight, pData)
return image
}
————————————————
版权声明:本文为CSDN博主「Kevin_Sun777」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Kevin_Sun777/article/details/109210383
其实很简单.SDK 就是 Software Development Kit 的缩写,中文意思就是“软件开发工具包”。这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。具体到我们这个系列教程,我们后面只讨论广义 SDK 的一个子集——即开发 Windows 平台下的应用程序所使用的 SDK。
为了解释什么是 SDK 我们不得不引入 API、动态链接库、导入库等等概念。不要怕,也就是几个新的名词而已,我也是到了大学快结束的时候才体会到其实学习新知识就是在学习新名词、新概念和新术语。
首先要接触的是“API”,也就是 Application Programming Interface,其实就是 *** 作系统留给应用程序的一个调用接口,应用程序通过调用 *** 作系统的 API 而使 *** 作系统去执行应用程序的命令(动作)。其实早在 DOS 时代就有 API 的概念,只不过那个时候的 API 是以中断调用的形式(INT 21h)提供的,在 DOS 下跑的应用程序都直接或间接的通过中断调用来使用 *** 作系统功能,比如将 AH 置为 30h 后调用 INT 21h 就可以得到 DOS *** 作系统的版本号。而在 Windows 中,系统 API 是以函数调用的方式提供的。同样是取得 *** 作系统的版本号,在 Windows 中你所要做的就是调用 GetVersionEx() 函数。可以这么说,DOS API 是“Thinking in 汇编语言”的,而 Windows API 则是“Thinking in 高级语言”的。DOS API 是系统程序的一部分,他们与系统一同被载入内存并且可以通过中断矢量表找到他们的入口,那么 Windows API 呢?要说明白这个问题就不得不引入我们下面要介绍得这个概念——DLL。
DLL(又是一个缩写,感觉 IT 这个行业里三字头缩写特别多),即 Dynamic Link Library(动态链接库)。我们经常会看到一些 .dll 格式的文件,这些文件就是动态链接库文件,其实也是一种可执行文件格式。跟 .exe 文件不同的是,.dll 文件不能直接执行,他们通常由 .exe 在执行时装入,内含有一些资源以及可执行代码等。其实 Windows 的三大模块就是以 DLL 的形式提供的(Kernel32.dll,User32.dll,GDI32.dll),里面就含有了 API 函数的执行代码。为了使用 DLL 中的 API 函数,我们必须要有 API 函数的声明(.H)和其导入库(.LIB),函数的原型声明不难理解,那么导入库又是做什么用的呢?我们暂时先这样理解:导入库是为了在 DLL 中找到 API 的入口点而使用的。
所以,为了使用 API 函数,我们就要有跟 API 所对应的 .H 和 .LIB 文件,而 SDK 正是提供了一整套开发 Windows 应用程序所需的相关文件、范例和工具的“工具包”。到此为止,我们才真正的解释清楚了 SDK 的含义。
希望能帮助到您
海康工业相机的算法使用方式因具体算法而异,以下是具体的使用步骤:1. 在海康官网下载和安装海康的SDK(Software Development Kit)。
2. 打开SDK,在其中创建一个新的项目并添加海康相机的驱动程序。
3. 根据相机的型号和算法需求选择相应的算法,并将其添加到项目中。
4. 进入算法设置界面,根据相机实际拍摄场景和需求进行参数调整。
5. 完成算法设置后,在主程序中引用算法,并将其与相机驱动程序进行连接。
6. 在实际使用中,通过编写相关代码来调用算法,获取相机采集的图像数据,并对其进行算法处理。
需要注意的是,不同的算法有不同的使用方法和参数设置,具体 *** 作应根据具体的算法需求和相关文档进行。同时,对于一些高级的算法,例如深度学习算法,还需要进行模型训练等 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)