视频流转帧,由于需求,需要对每一帧图片都做处理,现在我遇到几个问题,希望大佬解答:
1.由于每一帧的处理耗时1-2s且单线程,会导致处理过程中的帧丢失,而且我试过了多线程,也会存在帧丢失的问题,如何保证视频流中的每一帧都不丢失(至少大部分),比如:我对着镜头依次迅速地竖手指123,如何保证能获取到123的帧图片
2.在单线程情况下,由于涉及到各种算法,例如:人脸检测、肤色检测等,每一帧需要耗时约1-2s,请问是否有实时展示计算结果(imshow(处理结果))的解决方案?我考虑过多线程,while循环中获取帧一个线程函数,处理帧一个线程函数,但是存在“不能做到获取的帧与处理并展示的帧对应起来,下一帧的处理速度可能比上一帧快”等问题,求多线程处理视频帧图片的解决方案*_*
一般监控视频的帧率是每秒25帧~30帧。如果单线程单帧处理时间是1~2帧,那么要全部实时处理不丢帧,可能需要40~60个线程并行计算。也就是说,你需要有足够的CPU核数。
在这个基础上,还需要有个合理的多线程任务分发机制,才能保证解码的速度,与分析处理的速度都达到实时的要求。
实时展示计算结果,如果需要与画面叠加,则需要做一次画面叠加的计算处理,再进行展示。这里还需要测试画面处理的计算速度,是否能达到实时要求。
至于多线程时“下一帧比上一帧快”的问题,可以基于同步队列设计一个任务分发机制。
解码-->队列A(每帧数据打上顺序号)-->分发到各个分析线程-->按入队的序号排序推送到队列B-->合成画面-->展示计算结果。