gpt4 book ai didi

c++ - 在 OpenCV 2.4.9 中检测坏帧

转载 作者:可可西里 更新时间:2023-11-01 18:35:47 24 4
gpt4 key购买 nike

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

带有 ffmpeg + OpenCV 2.4.9 的 CentOS。我正在开发一个简单的运动检测系统,它使用来自 IP 摄像机 (h264) 的流。

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

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

好的帧(运动捕捉):

Good Frame

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

Bad Frame

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

谢谢!

编辑更新:

帧是使用 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;
}

关于c++ - 在 OpenCV 2.4.9 中检测坏帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com