cvQueryFrame速度过慢的问题
转载请注明出处
我的 上一篇博文中讲到通过cvQueryFrame读取摄像头的图像,其速度是受到硬件限制的。换句话说,无论你怎么写代码,cvQueryFrame都有一个反应速度。对于笔记本电脑自带的摄像头,大约是50ms左右。
但是有的情况下,即使图像不能及时更新,我们也希望可以快速的读取到一帧,而不是卡在那里等待总线向我们传输新的一帧。图像可以以50ms一次的效率更新(这受限于硬件是没办法的),但是我们希望可以以更高的频率获取图像并且进行处理。这种情况往往出现在一些半物理的实时系统中,系统的整体周期并不以图像为核心,因此需要图像无论何时都能短周期读取,而不会影响系统的整体周期。
这次在完成一个任务的时候,我就遇到了一个问题,程序的运行周期是严格的20ms,一个周期必须准时运行完毕。但是图像读取到达了40ms左右。因此利用多线程的思路,开发了并行的读取方式,让图像的拉取和图像的处理程序在两个线程里独立完成。这样来解决了问题。
实现代码及思路
实现思路
具体思路就是数据处理与从硬件拉取数据两者分开,在两个线程内。
从硬件拉取数据的线程,每拉取到一帧新的数据,就储存在数据中转区。数据处理的线程每一个程序运行循环,从数据中转区复制出数据进行使用。数据中转区用线程锁锁住防止两个线程冲突访问。
C++多线程相关的知识参考这篇文章即可。
实现环境
实现环境为c++11下opencv 2.4.9
#include <thread>
#include <mutex>
#include <cv.h>
多线程代码
需要定义的变量如下:
CvCapture *capture;//数据流指针
thread *capThread;//图像读取线程指针
IplImage *pSrcImg;//中转图像所在指针
mutex *mut;//线程锁
IplImage *getPic;//最终获取到的图像指针
int *endFlag;//线程结束标志变量指针
系统初始化代码:
IplImage *testPic;//用于测试获取到的图像大小的图像指针
CvSize srcImgSize