关于使用海康相机SDK采集图片并传递给C++的使用总结
一.背景
需要用C#调用海康相机SDK采集图片,并将采集的图片以Byte[]数组的形式传递给C++版视觉处理dll
二.步骤
1.声明变量
public MyCamera myCamera;//相机对象
MyCamera.MV_CC_DEVICE_INFO_LIST m_pDeviceList;
IntPtr m_BufForDriver = IntPtr.Zero;
private static Object BufForDriverLock = new Object();
2.初始化相机
public int InitCamera(IntPtr handle)
{
//枚举设备,默认选择第一个
try
{
MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_pDeviceList);
//这里默认选择了第一个相机
MyCamera.MV_CC_DEVICE_INFO device =
(MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_pDeviceList.pDeviceInfo[0],
typeof(MyCamera.MV_CC_DEVICE_INFO));
int nRet = -1;
// ch:打开设备 | en:Open device
if (null == myCamera)
{
myCamera = new MyCamera();
if (null == myCamera)
{
return -1;
}
}
//创建设备
nRet = myCamera.MV_CC_CreateDevice_NET(ref device);
if (MyCamera.MV_OK != nRet)
{
return -1;
}
//打开设备
nRet = myCamera.MV_CC_OpenDevice_NET();
if (MyCamera.MV_OK != nRet)
{
myCamera.MV_CC_DestroyDevice_NET();
//System.Windows.Forms.MessageBox.Show("open device Fail!");
ShowErrorMsg("Device open fail!", nRet);
return -1;
}
// 开始 grabing
int temp = myCamera.MV_CC_StartGrabbing_NET();
if (MyCamera.MV_OK != temp)
{
ShowErrorMsg("Trigger Fail!", temp);
return -1;
}
//获得显示句柄
//int nRet2 = myCamera.MV_CC_Display_NET(handle);
//if (MyCamera.MV_OK != temp)
//{
// ShowErrorMsg("Display Fail!", nRet2);
// return -1;
//}
// 设置采集模式 -触发模式;触发源-软触发; 触发一次
myCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
myCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
return 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return -1;
}
}
3.触发拍照
public int TakePhoto()
{
try
{
int nRet;
// ch:触发命令 | en:Trigger command ,触发一次
nRet = myCamera.MV_CC_SetCommandValue_NET("TriggerSoftware");
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Trigger Fail!", nRet);
return -1;
}
return 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return -1;
}
}
4.取像、显示并转换传递出去
public void ReceiveAndConvert()
{
MyCamera.MV_FRAME_OUT stFrameOut = new MyCamera.MV_FRAME_OUT();
MyCamera.MV_DISPLAY_FRAME_INFO stDisplayInfo = new MyCamera.MV_DISPLAY_FRAME_INFO();
//此处的延时很重要,不合适会有拖影,测试相机为6500w像素 其中曝光500ms最低800ms,
int nRet = m_MyCamera.MV_CC_GetImageBuffer_NET(ref stFrameOut, 1000);
if (nRet == MyCamera.MV_OK)
{
//显示
stDisplayInfo.hWnd = pictureBox1.Handle;
stDisplayInfo.pData = stFrameOut.pBufAddr;
stDisplayInfo.nDataLen = stFrameOut.stFrameInfo.nFrameLen;
stDisplayInfo.nWidth = stFrameOut.stFrameInfo.nWidth;
stDisplayInfo.nHeight = stFrameOut.stFrameInfo.nHeight;
stDisplayInfo.enPixelType = stFrameOut.stFrameInfo.enPixelType;
int nret = m_MyCamera.MV_CC_DisplayOneFrame_NET(ref stDisplayInfo);
// display
if (nret != MyCamera.MV_OK)
{
Console.WriteLine("display error!");
break;
}
//copy convert to byte[]
byte[] data = new byte[stFrameOut.stFrameInfo.nFrameLen];
Marshal.Copy(stFrameOut.pBufAddr, data, 0, (int)stFrameOut.stFrameInfo.nFrameLen);
m_MyCamera.MV_CC_FreeImageBuffer_NET(ref stFrameOut);
//save
//SavePic(stFrameOut.pBufAddr, stFrameOut.stFrameInfo, res, 1);
//图像处理在此处进行
byte[] bPara = new byte[100000];
int detectres = -1;
try
{
detectres = C++Dll.VisionMethod(data);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
5.finished
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了