我知道标题有点模糊,但我不确定如何描述它。
这是一个关于在CentOS上使用ffmpeg和OpenCV 2.4.9的问题。我的工作是开发一个简单的运动检测系统,通过IP摄像头( h264 )来实现视频流的监控。
偶尔视频流会出现"坏帧"(参见下面的pic-bad.png链接),问题在于这些帧与之前的帧差别很大,即使没有实际运动,也会触发"运动"事件。
下面的图片将解释问题:
好的一帧(捕捉到了运动):
坏的一帧(没有运动,只是一个破碎的帧):
这些坏帧是随机抓取的,我想可以通过分析(循环)从某个位置向下的像素是否都相同来制作一个坏帧检测器,但我想知道是否有任何其他更有效,更符合规范的方法来检测这些类型的坏帧和跳过它们。
谢谢!
编辑更新:
该帧是通过C ++运动检测程序使用
这是一个关于在CentOS上使用ffmpeg和OpenCV 2.4.9的问题。我的工作是开发一个简单的运动检测系统,通过IP摄像头( h264 )来实现视频流的监控。
偶尔视频流会出现"坏帧"(参见下面的pic-bad.png链接),问题在于这些帧与之前的帧差别很大,即使没有实际运动,也会触发"运动"事件。
下面的图片将解释问题:
好的一帧(捕捉到了运动):
![Good Frame](https://istack.dev59.com/SQpEC.webp)
![Bad Frame](https://istack.dev59.com/gsBO1.webp)
谢谢!
编辑更新:
该帧是通过C ++运动检测程序使用
cvQueryFrame(camera);
来抓取的,因此我不直接与ffmpeg进行交互,而是由OpenCV在后台处理。我正在使用从git源编译的最新版本的ffmpeg。所有库也都是最新的(h264等,昨天都下载和编译的)。数据来自RTSP流(ffserver)。我已经测试了多个摄像头(dahua 1-3 MP型号),帧故障在所有摄像头上都很持久,尽管它并不连续发生,只是偶尔会发生(例如:每10分钟一次)。
cvQueryFrame(camera);
抓取的,因此我不直接与ffmpeg进行交互,OpenCV在后端完成。我正在使用从git源编译的最新版本的ffmpeg。所有库也都是最新的。数据来自RTSP流。我已经在多个摄像头(大华)上进行了测试,帧故障非常持久,尽管它不会连续发生,只是偶尔发生(例如:每10分钟一次)。 - user3630380cvQueryFrame(camera);
我认为这是 C 版本的,但你能发一些代码吗?也许你应该在 for 循环的末尾加上cv::waitKey(10);
,因为它可能太快了(也许...) - thedarkside ofthemoonwaitKey(50)
的等待代码。我之前也看到过这种情况,但是当视频以约30fps的速度播放时,每秒钟能看到30帧画面,如果只是单独一帧这样的情况并不是很严重。但是,在进行帧分析时就不同了。我有点惊讶没有人发现ffmpeg的这种行为。我99%确定这是由ffmpeg方面的某些解码问题引起的,我只是好奇是否有任何方法可以防止它或自动检测并删除它。 - user3630380