Opencv的videocapture有个特点就是:当你读取摄像头的时候,摄像头的每帧数据会全部存入你的缓冲区,你需要一帧接一帧的把缓冲区的图片依次进行处理,如果你的处理速度小于存进缓冲区的速度,那么缓冲区的图片就越积累越多,而你处理的图片可能是摄像头拍摄的好几秒前的数据。
为了解决这个问题,我之前的办法是读取图片的次数大于处理的次数,比如每隔读取十次,我处理一次,这样我的缓冲区就不会拥塞。
当我了解到多线程编程之后,就可以完美的解决这个问题了,用两个线程,一个用来读取图片,一个用来处理图片。代码如下:
VideoCapture cap;
if (!cap.open("rtsp://admin:g214g214@192.168.1.55/h264/ch1/main/av_stream"))
{
std::cout << "Error opening video stream or file" << std::endl;
}
#pragma omp parallel sections//分两个平行线程进行工作
{
#pragma omp section//其中一个线程
{
while(1)
{
cap.read(frame);//读取图片
}
}
#pragma omp section//另一个线程
{
Mat CopyImge;
while (1)
{
#pragma omp critical//互斥锁,保证从另一个线程取图片的时候,两个线程会有冲突
{
frame.copyTo(CopyImge);
}
imshow("CopyImge",CopyImge);
}
}
}