【发布时间】:2014-06-30 11:39:47
【问题描述】:
我知道标题有点含糊,但我不确定如何描述它。
带有 ffmpeg + OpenCV 2.4.9 的 CentOS。我正在开发一个简单的运动检测系统,它使用来自 IP 摄像机(h264)的流。
流偶尔会打嗝并抛出“坏帧”(请参阅下面的 pic-bad.png 链接)。问题是,这些帧与之前的帧有很大不同,即使没有发生实际运动,也会触发“运动”事件。
下面的图片将解释问题。
好帧(运动捕捉):
坏帧(没有运动,只是一个破碎的帧):
坏帧被随机捕获。我想我可以通过分析(循环)从某个位置向下的像素来制作一个坏帧检测器,看看它们是否都相同,但我想知道是否还有其他更有效的方法,“按书" 检测这些类型的坏帧并跳过它们的方法。
谢谢!
编辑更新:
帧是通过cvQueryFrame(camera); 使用 C++ 运动检测程序抓取的,所以我不直接与 ffmpeg 交互,OpenCV 在后端进行。我正在使用从 git 源编译的最新版本的 ffmpeg。所有的库也是最新的(h264 等,昨天全部下载并编译)。数据来自 RTSP 流 (ffserver)。我已经测试了多台相机(大华 1 - 3 MP 型号),并且帧故障在所有相机上都非常持久,尽管它不会连续发生,只是偶尔发生一次(例如:每 10 分钟一次)。
【问题讨论】:
-
你是如何抓帧的?
-
可能是ffmpeg编解码器。但是您可以在录制的视频上对其进行测试。 See this
-
帧是通过
cvQueryFrame(camera);使用C++ 运动检测程序抓取的,所以我不直接与ffmpeg 交互,OpenCV 在后端进行。我正在使用从 git 源编译的最新版本的 ffmpeg。所有的库也是最新的。数据来自 RTSP 流。我已经在多台相机(大华)上进行了测试,并且帧故障非常持久,尽管它不会连续发生,只是偶尔发生一次(例如:每 10 分钟一次)。 -
cvQueryFrame(camera);我认为是C版本,但你能发布一些代码吗?也许你应该在 for 循环的末尾放一个cv::waitKey(10);,它可能太快了(也许......) -
我确实有等待代码,
waitKey(50)。我之前已经看过很多次了,但是在观看 @ ~30fps 的视频时,每秒看到的 30 帧中的单帧并不是什么大问题,但是,在进行帧分析时却是。我有点惊讶没有人在 ffmpeg 上看到过这样的行为。我 99% 确定这是由 ffmpeg 端的一些解码问题引起的,我只是好奇是否有任何方法可以防止它或自动检测并丢弃。