OpenCV读取视频产生稳定延迟情况的解决方案 Solution for reading pictures with stable delay by OpenCV

OpenCV读取视频产生稳定延迟情况的解决方案

Solution for reading pictures with stable delay by OpenCV

最近在做对代码的延时标定,发现了一个问题,图像处理已经达到了20ms每循环,但OpenCV的视频帧整体延时了500ms,并且第一帧收帧时如果在500ms以内就imshow帧,则出现错误中断。

采取以下措施定位问题:

  1. 使用微软专用软件标定相机,发现相机只是拍照+回传至电脑内存,延迟不超过100ms,因此不是相机问题;
  2. 测试程序时钟,除了初始化的500ms以外,每次循环不超过20ms,因此,不是代码问题;
  3. OpenCV;

最终确定是OpenCV的问题,接下来定位:

  1. OpenCV版本问题;
  2. OpenCV其它问题;

自用OpenCV版本为2.4.13,换成3.1也有整体延时的情况。
最后上网搜索博客:

  • https://blog.csdn.net/qq_43443531/article/details/97375918
  • https://blog.csdn.net/qq_38392644/article/details/85197264

OpenCV默认输出格式为YUYV,可将其改成MJPG格式。
尝试成功:

...
capture.open(1);
//这里添加一行
//OpenCV 2
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
//or OpenCV 3
capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
//继续接下来的代码
capture.set(CV_CAP_PROP_FRAME_WIDTH, 2560);  //设置捕获视频的宽度
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 720);  //设置捕获视频的高度
...

PS:OpenCV2和3的代码是不一样的,当时还以为OpenCV2的库里没有这个格式,后来翻了API reference:

  • https://docs.opencv.org/2.4.13.6/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=set#cv2.VideoCapture.set

查到OpenCV2的函数:

OpenCV读取视频产生稳定延迟情况的解决方案 Solution for reading pictures with stable delay by OpenCV_第1张图片

OpenCV读取视频产生稳定延迟情况的解决方案 Solution for reading pictures with stable delay by OpenCV_第2张图片
找到最后的函数格式。

总结:

  1. 找了很久底层的原因,看底层很多自己本来也不太懂的东西,包括看API,结果在CSDN上直接找到了解决方案,虽然到现在还没搞清楚特别具体的原因,只是简单定位到了大致的范围,但也是总算解决了,也感叹:现在的技术壁垒越来越高了,说不得这是分专业的好处还是坏处;不过能在国内网站上找到原因,也说明中国的开源技术库总算是建出规模了(老师说的好)。
  2. OpenCV的API reference真的是个好东西,原来没有看这个的习惯,现在要养成了。

你可能感兴趣的:(OpenCV读取视频产生稳定延迟情况的解决方案 Solution for reading pictures with stable delay by OpenCV)