Opencv读取摄像头缓冲区拥塞,有延迟情况下,处理最新帧的方法

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);
				}
			}
	}
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值