微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用v4l2到OpenCL缓冲区从相机捕获帧的最佳方法是什么?

如何解决使用v4l2到OpenCL缓冲区从相机捕获帧的最佳方法是什么?

我正在构建一个应用程序,该应用程序需要从4个不同的摄像机捕获图像,并使用带有OpenCL的OpenCV构建程序来处理图像。

我是这个流的新手,我能够使用v4l2构建一个应用程序以捕获图像。我正在使用使用clCreateBuffer创建的OpenCL缓冲区使用cv :: ocl :: convertFromBuffer创建cv :: UMat。但是要将捕获的帧格式从v4l2缓冲区传输到OpenCL缓冲区,我使用的是memcpy,这会花费更多时间(使用OpenMP for循环获取4张图片需要约15ms)。

用于memcpy操作的代码

cl_mem newBuffer[4] ;
unsigned char *cDataIn[4];
cv::UMat UmatFullRes[4];

/* Init (only once) */
for (int j = 0; j < 4; j++) {
    newBuffer[j] = clCreateBuffer(context,CL_MEM_READ_WRITE,(1280*800*4),NULL,NULL);
    cDataIn[j] = (unsigned char*)clEnqueueMapBuffer(cmdq[j],newBuffer[j],CL_FALSE,CL_MAP_WRITE | CL_MAP_READ,NULL);
}
for (int j = 0; j < 4; j++) {
    memcpy(cDataIn[j],buf[j],(1280 * 800 * 4));
    cv::ocl::convertFromBuffer(newBuffer[j],1280 * 4,800,1280,CV_8UC4,UmatFullRes[j]);
}

在上面的代码中,buf [j]是v4l2缓冲区的无符号char *变量mmap。我正在尝试使用对OpenCL缓冲区进行零复制(VIdioC_EXPBUF)来实现捕获过程,以避免memcpy操作。

如果您能帮助我理解“如何在我的情况下使用VIdioC_EXPBUF?”,我也将不胜感激,任何VIdioC_EXPBUF的示例代码片段都将有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。