繁体   English   中英

检测OpenCV 2.4.9中的坏帧

[英]Detect bad frames in OpenCV 2.4.9

我知道标题有点模糊,但我不确定如何描述它。

CentOS与ffmpeg + OpenCV 2.4.9。 我正在研究一种简单的运动检测系统,它使用来自IP摄像机的流(h264)。

偶尔流会打嗝并抛出一个“坏帧”(见下面的pic-bad.png链接)。 问题是,这些帧在很大程度上与先前帧不同,并且即使没有发生实际运动也会导致“运动”事件被触发。

下面的图片将解释这个问题。

好帧(捕获的动作):

好框架

坏帧(没有动作,只是一个破帧):

糟糕的框架

坏帧被随机捕获。 我想我可以通过分析(循环)通过从某个位置向下的像素来制作一个糟糕的帧检测器,看看它们是否完全相同,但我想知道是否还有其他的,更有效的,“这本书“检测这些类型的坏帧并跳过它们的方法。

谢谢!

编辑更新:

通过cvQueryFrame(camera);使用C ++运动检测程序抓取帧cvQueryFrame(camera); 所以我不直接与ffmpeg接口,OpenCV在后端做它。 我正在使用从git源编译的最新版本的ffmpeg。 所有的库都是最新的(h264等,昨天全部下载和编译)。 数据来自RTSP流(ffserver)。 我已经测试了多台摄像机(大华1 - 3 MP机型),并且机架故障在所有这些机架上非常持久,虽然它不会连续发生,只是偶尔发生一次(例如:每10分钟一次)。

在第一种方法中我想到的是通过计算不相同的像素来检查有效帧的示例与我们正在检查的示例之间的不相似性。 将这个数除以面积,我们得到衡量不相似度的百分比。 我猜大于0.5我们可以说测试帧是无效的,因为它与有效帧的例子有很大不同。

这个假设只适用于你有一个静态相机(它不移动),并且可以在它前面移动的物体不在最短距离内(取决于焦距,但如果你有例如宽镜头那么物体不应该在相机前方出现不到30厘米,以防止物体从不知名的地方“跳入”框架并且其尺寸大于框架区域的50%)。

在这里你有opencv功能,它做我说的。 实际上,如果您认为运动变化会更快,您可以将相似系数调整得更大。 请注意,第一个参数应该是有效帧的示例。

bool IsBadFrame(const cv::Mat &goodFrame, const cv::Mat &nextFrame) {
    // assert(goodFrame.size() == nextFrame.size())

    cv::Mat g, g2;
    cv::cvtColor(goodFrame, g, CV_BGR2GRAY);
    cv::cvtColor(nextFrame, g2, CV_BGR2GRAY);

    cv::Mat diff = g2 != g;

    float similarity = (float)cv::countNonZero(diff) / (goodFrame.size().height * goodFrame.size().width);

    return similarity > 0.5f;
}

您没有提到是否使用ffmpeg命令行或库,但在后一种情况下,您可以检查坏帧标志(我忘记了它的确切描述)并简单地忽略这些帧。

删除waitKey(50)或将其更改为waitKey(1) 我认为opencv不会产生一个新线程来执行捕获。 所以当有一个暂停时,它会混淆缓冲区管理例程,导致坏帧...可能?

我有大华相机,并观察到延迟较高,观察到坏帧。 然后他们完全用waitKey(1)离开了。 暂停不一定需要来自waitKey 调用例程也会导致这种暂停,并且如果它们花费的时间足够长,则会导致错误的帧。

这意味着连续帧抓取之间应该有最小的暂停。解决方案是使用两个线程分别执行捕获和处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM