在第一种方法中我想到的是通过计算不同的像素来检查有效帧的示例与我们正在检查的示例之间的不相似性.将这个数除以面积,我们得到衡量不相似度的百分比.我猜大于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;
}