OpenCV读取视频产生稳定延迟情况的解决方案(一)
Solution for reading pictures with stable delay by OpenCV
最近在做对代码的延时标定,发现了一个问题,图像处理已经达到了20ms每循环,但OpenCV的视频帧整体延时了500ms,并且第一帧收帧时如果在500ms以内就imshow帧,则出现错误中断。
采取以下措施定位问题:
- 使用微软专用软件标定相机,发现相机只是拍照+回传至电脑内存,延迟不超过100ms,因此不是相机问题;
- 测试程序时钟,除了初始化的500ms以外,每次循环不超过20ms,因此,不是代码问题;
- OpenCV;
最终确定是OpenCV的问题,接下来定位:
- OpenCV版本问题;
- 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的函数:
找到最后的函数格式。
总结:
- 找了很久底层的原因,看底层很多自己本来也不太懂的东西,包括看API,结果在CSDN上直接找到了解决方案,虽然到现在还没搞清楚特别具体的原因,只是简单定位到了大致的范围,但也是总算解决了,也感叹:现在的技术壁垒越来越高了,说不得这是分专业的好处还是坏处;不过能在国内网站上找到原因,也说明中国的开源技术库总算是建出规模了。
- OpenCV的API reference真的是个好东西,原来没有看这个的习惯,现在要养成了。
- OpenCV延时还可以缩短,于是我又写了个(二)哈哈哈哈哈