采集图像

SDK支持回调取图或轮询取图两种方式采集图像。您可根据实际使用情况,选择所需的采集方式。
注意
您仅可使用其中一种采集方式,不支持同时使用两种方式。

回调取图

SDK提供注册回调取图接口,您可通过调用 MV_CC_RegisterImageCallBackEx() 和在SDK内部注册自定义回调函数实现回调取图。在SDK获取到相机图像后,SDK会主动调用您自定义的回调函数。
注意
  • 不建议您在回调函数中添加耗时操作、线程锁等。若添加,易造成回调阻塞。
  • 回调的pData在回调结束后无效。在回调结束后,您不能再次使用pData。
该方式的基本步骤如下:
  1. 调用 MV_CC_SetImageNodeNum() ,设置合适的缓存节点个数。
    注解
    您可根据实际情况,设置所需的缓存节点个数。主要影响因素有:相机帧率、图像分辨率和电脑配置(主板性能、内存大小)等。
  2. 调用 MV_CC_RegisterImageCallBackEx() ,注册图像处理函数。
  3. 调用 MV_CC_StartGrabbing() ,开始采集图像。
  4. 等待SDK收到图像,并执行,在自定义的图像处理函数中处理图像。
如下示例代码演示了通过回调函数采集图像的过程:

轮询取图

SDK提供主动获取图像的接口,您可以创建线程,并在线程内部循环调用取图接口,获取图像。
轮询取图的基本步骤如下:
  1. 调用 MV_CC_SetImageNodeNum() ,设置SDK内部缓存节点个数。

    注解
    • SDK接收相机的图片数据并缓存在SDK内部,供外部调用。其中通过 MV_CC_SetImageNodeNum() 配置SDK内部缓存节点个数。若上层调用偏慢,且缓存节点有限,会导致SDK没有空间接收相机新发送的图像数据,导致丢帧。
    • 具体申请多少块图像缓存需要根据实际情况决定,主要影响因素有:相机帧率、图像分辨率和电脑配置(主板性能、内存大小)等。
  2. 调用 MV_CC_StartGrabbing() 开始采集。

  3. 在应用层,调用 MV_CC_GetImageBuffer() 获取指定像素格式的帧数据。

    注解
    • 您可以设置该接口的超时时间。未超时前,SDK内部等待直到有数据返回。
    • 获取图像数据时,您需要根据相机帧率,合理配置上层应用程序的接口调用频率。
  4. 操作buffer进行图像处理等。
  5. 调用 MV_CC_FreeImageBuffer() 释放buffer。

    注解
    调用 MV_CC_FreeImageBuffer() 后,buffer会被归还至SDK。归还后,buffer失效。
如下示例代码演示了轮询取图的过程:
  1. 自定义线程函数,接收并处理图像。

    static unsigned int __stdcall WorkThread(void* handle)
    {
    int nRet = MV_OK;
    MV_FRAME_OUT stOutFrame = {0};
    while(true)
    {
    nRet = MV_CC_GetImageBuffer(handle, &stOutFrame, 1000);
    if (nRet == MV_OK)
    {
    printf("Get Image Buffer: Width[%d], Height[%d], FrameNum[%d]\n",
    stOutFrame.stFrameInfo.nWidth, stOutFrame.stFrameInfo.nHeight, stOutFrame.stFrameInfo.nFrameNum);
    nRet = MV_CC_FreeImageBuffer(handle, &stOutFrame);
    Check(nRet);
    }
    if(g_bExit)
    {
    break;
    }
    }
    return 0;
    }
  2. 开始采集。

    // 设置缓存节点个数
    Check(nRet);
    // 开始取流
    Check(nRet);
    unsigned int nThreadID = 0;
    void* hThreadHandle = (void*) _beginthreadex(NULL , 0 , WorkThread , handle, 0 , &nThreadID );
    if (NULL == hThreadHandle)
    {
    break;
    }



上一篇: 配置缓存 下一篇: 处理图像