本文主要介绍视频画面冻结的检测。
1、视频画面冻结的定义
关于冻结的认知有两种:(1)时间流和画面均定格不动;(2)时间流在走,画面定格不动。
2、检测算法
一般采用区域直方图相似度对比或者像素差异对比,达到一定的阈值TH后认为该帧满足冻结判定,连续N帧后判定画面冻结。但直方图的方式,本人认为有较大误差,毕竟只考虑分布像素的的数量,忽略了位置,故误差较大,容易误报。本文实现像素差异对比的算法。
3、原理介绍
通常摄像头采集的连续两帧画面,肉眼看起来一致,但受环境光、感光元器件、电信号转换等的影响,会有一定的差异,利用该差异可以判定该像素位置是否变化。该方法可以有效避免画面背景单一、目标长时间不动造成的误报。
通过实验可以得到同一像素位置的差异值 T,对连续获得的视频帧做差分,统计变化的像素个数NUMBER,达到一定的比例后,认为当前帧画面变化,否则认为当前帧冻结,累计N帧后判定监控画面冻结。
4、代码实现
Mat baseimg; //全局变量
int T = 10; //假设同一像素位置的变化范围为10
void ViewFreeze2(Mat src, float &k)
{
if (baseimg.empty())
{
baseimg = src.clone();
k = 0;
return;
}
Mat src_gray, base_gray;
cvtColor(src, src_gray, CV_BGR2GRAY);
cvtColor(baseimg, base_gray, CV_BGR2GRAY);
int NUM = 0;
for (int i = 0; i < src_gray.rows;i++)
{
uchar*ptr1 = src_gray.ptr<uchar>(i);
uchar*ptr2 = base_gray.ptr<uchar>(i);
for (int j = 0; j < src_gray.cols; j++)
{
if (abs(ptr1[j]-ptr2[j]>T))
NUM++;
}
}
k = (float)NUM / (src_gray.rows*src_gray.cols);
}
本人希望在分享过程中与各位共同学习、共同提高!