本文主要介绍视频遮挡的诊断。
1、亮度异常的定义
视频画面中由于人为或非人为因素导致设置的监控区域画面上有大面积的遮挡。
2、算法思路
图像发生遮挡时:(1)对应的区域必然会模糊,边缘信息减少;(2)该区域的像素方差也减小。基于此,对图像做边缘检测,分别对边缘图和原图求方差。
为了提高诊断准确率,可将图分成N*N块,分别对小块进行诊断,满足条件认为该帧图像遮挡。
3、代码实现
话不多说,直接上代码。
bool Cover2(Mat src)
{
bool IsCovered = false;
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
Mat lapImg;
Laplacian(gray, lapImg, gray.depth());
int CoverBlock = 0;
for (int i = 0; i < gray.rows; i = i + gray.rows / 3)
{
for (int j = 0; j < gray.cols; j = j + gray.cols / 3)
{
float sigma_g = 0;
float sigma_l = 0;
Rect r = Rect(j, i, gray.cols / 3, gray.rows / 3);
Mat subImg = gray(r);
Mat subLap = lapImg(r);
Mat means, stddev_g, stddev_l;
meanStdDev(subImg, means, stddev_g);
meanStdDev(subLap, means, stddev_l);
sigma_g = stddev_g.at<double>(0);
sigma_l = stddev_l.at<double>(0);
if (sigma_g < 25 && sigma_l < 10)
CoverBlock++;
}
}
IsCovered = CoverBlock > 0 ? true : false;
return IsCovered;
}
学习使我快乐!本人希望在分享过程中与各位共同学习、共同提高!
5.27更
该方法有个缺陷:遮挡必须覆盖一个定义的格子范围,否则原图的像素差异会变大,对应的方差也会变大,反而起不到遮挡预警的作用。