视频分析算法效率1帧/秒,所以我需要等算法完成后,再获得最新的一帧图像。
然而VideoCapture很“耿直”的一帧不落的输出帧,“等”我处理每一帧。
算法速度跟不上视频帧速,旧帧越积越多。不能实现处理最新帧的目的。
如何解决?
楼主自己的回答思路正解,推荐http://download.csdn.net/download/masikkk/5218336 这里是你说法的实现。
但是仍未解决及时抛去旧帧的,楼主可以增加一句,在新一帧进入缓存前,把队列清空,保证队列只有最新帧。
自问自答,使用openmp分两个线程做,一个线程实时读取视频流到全局mat中,另一个线程拷贝全局mat进行处理。
注意线程中操作mat部分加互斥锁。
可以设计一个变量i,每读一帧计数加一,当i/25==0才进入处理,也就是每25帧才取一帧进行处理,或者调整摄像头帧率慢一些
这个问题我也是困扰了很久的,后来自己想了个办法解决了,很简单且效果不错,写出来供参考。
因为读取缓存区的帧需要的时间很短,而视频的帧间隔时间应该大概是33ms(30fps)。需要读取新的帧的时候,设一个循环,不断读取视频流的新帧,计算每次读取新帧时消耗的时间。当读取新帧消耗的时间大于10ms时,读出来的就是最新的帧了。
这个方法的优点是,处理图像的时间变化很大的时候,仍然可以及时获得最新的帧。
我也遇到这种问题,不知道有没有更好的方法,先献上我的方法:
看这样的思路行不行,通过时间戳来筛选,创建一个队列,把每一帧都入队,并且为每一帧记录一个时间戳,就从整数1.2.3这样排下去,取帧的时候,计算一下当前时间,结合帧率,根据时间戳把不要的帧全部出队丢掉,只留下时间戳正确的帧分析
python的可以看看,我这篇,主要思路和上边的同学差不多,就是自己做一个帧缓冲区,自己管理帧缓存,按时清除旧的帧就可以了。https://blog.csdn.net/weixin_43409627/article/details/89454885
https://github.com/cxstdio/pycv4rtsp
你好,想问一下大家的opencv是否有编译gstreamer,我出点编译gstreamer后,用VideoCapture读取rtsp视频流的串时,如果该视频流串暂时无视频能拉倒,这句话(VideoCapture(uri))就卡死,也不报错也不跳出,但是没有编译过gstreamer的opencv就会正常返回False,不至于程序卡死,有人知道该怎么处理的吗,谢谢!
不是我说,提这种问题的人,太懒了