C#版-海康工业相机SDK实现隔时取帧方式
项目需要用到相机实时采集并每隔几帧处理一帧的功能,由于之前未接触过,一直不知道怎么实现,通过查阅各种资料,终于解决了相机隔时取帧并显示,特此记录下,做个笔记记录下。主要参考了@物随心转的这篇帖子,给了很大的引导作用,非常感谢!
相机SDK的采集帧的流程各个厂商大多一致,下面以海康相机通过回调方式取图为例:
SDK提供注册回调函数的接口,用户可以将自己定义的回调函数注册在SDK内部,SDK获取到相机图像会主动回
调到应用程序供用户处理,此方式可以简化用户程序逻辑。
• 回调取图方式使用场景:
可以使用 MV_CC_RegisterImageCallBackEx_NET() 接口注册回调函数。回调函数可以自定义,用于自动回
调获取的图像。此方法可以简化应用程序逻辑。如果你想设置获取RGB24或BGR24格式的图像数据,也可以使用
MV_CC_RegisterImageCallBackForRGB_NET() 或 MV_CC_RegisterImageCallBackForBGR_NET() 来注册回
调函数。
• 注意事项:
a、回调函数中不建议有耗时操作、线程锁等,容易造成回调阻塞。
b、Pdata返回的是一个地址指针,将其作为图像处理操作,由于较耗时,为避免线程阻塞,建议将Pdata里面
的数据copy出来另建线程使用。
在每次StartGrabbing取一帧的时候内部就会自动调用一次回调函数,因此可在回调函数中计数取帧,并在回调函数中通过MV_CC_DisplayOneFrame_NET将视频流显示在pictureBox控件上。
回调函数部分实现如下
.
static int A = 0;
static bool B = false;
MyCamera.MV_DISPLAY_FRAME_INFO stDisplayInfo1 = new MyCamera.MV_DISPLAY_FRAME_INFO();//接受图像信息,后续再转成需要的格式
//回调函数的实现
public void ImageCallbackFunc(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser)
{
A++;
if (A == 5)
{
B = true;
A = 0;
}
while (B)
{
stDisplayInfo1.hWnd = pictureBox2.Handle;
stDisplayInfo1.pData = pData;
stDisplayInfo1.nDataLen = pFrameInfo.nFrameLen;
stDisplayInfo1.nWidth = pFrameInfo.nWidth;
stDisplayInfo1.nHeight = pFrameInfo.nHeight;
stDisplayInfo1.enPixelType = pFrameInfo.enPixelType;
m_pMyCamera.MV_CC_DisplayOneFrame_NET(ref stDisplayInfo1);
B = false;
}
MyCamera.MV_DISPLAY_FRAME_INFO stDisplayInfo = new MyCamera.MV_DISPLAY_FRAME_INFO();
stDisplayInfo.hWnd = pictureBox1.Handle;
stDisplayInfo.pData = pData;
stDisplayInfo.nDataLen = pFrameInfo.nFrameLen;
stDisplayInfo.nWidth = pFrameInfo.nWidth;
stDisplayInfo.nHeight = pFrameInfo.nHeight;
stDisplayInfo.enPixelType = pFrameInfo.enPixelType;
m_pMyCamera.MV_CC_DisplayOneFrame_NET(ref stDisplayInfo);
}
C#代码见:这里