qt+opencv实现敏感区域移动侦测
上一篇qt +opencv dnn+tensorflow实现敏感区域预警使用起来准确率高,能针对特定的物品侵入进行专门识别,但运行速度不是很快,不能达到实时识别,今天使用移动侦测算法进行了下测试,发现速度相当快,达到了实时检测实时反映的效果。这也是现有的监控系统普遍采用的预警方式,但也有不足,对室外有风时会引发误报,如果在光线稳定的室内,效果是相当好的。
在这里插入图片描述
从图上可以看出,打开摄像头后。点移动侦测,进入预警模式,放入手面立即就声音报警了。
移动侦测一般使用的是背景帧差法,有二帧差,三帧差,等算法。
相关详细算法网上一大把,主要算法在页尾贴出。这里重点说一下检测到入侵后报警关联的算法。一般把大于100像素作为取舍点。然后使用qsound进行异步调用。
帧差法速度是相当的快,效果也相当的好,在使用四路同时显示时,还能做到实时检测。
QT中的主要代码
Mat frame, gray_frame;
Mat BgImg, FrImg_src, FrImg;
Mat BgImg_32, FrImg_src_32, FrImg_32;
bool firstflag = true;
//while (1)
tz=5;
Sleep(30);
while (capture.read(frame))
{
// capture >> frame;
if (frame.empty())
return;
if (firstflag)
{
cvtColor(frame, BgImg, CV_BGR2GRAY);
BgImg.convertTo(BgImg_32, CV_32FC1); //BgImg、FrImg、FrImg_src都已经转换为CV_32FC1.
firstflag = false;
FrImg_32 = BgImg_32.clone();
FrImg_src_32 = BgImg_32.clone();
}
else
{
cvtColor(frame, gray_frame, CV_BGR2GRAY);
gray_frame.convertTo(gray_frame, CV_32FC1);
absdiff(gray_frame, BgImg_32, FrImg_src_32);//这是主要的代码将二个mat对比
threshold(FrImg_src_32, FrImg_32, 50, 255.0, CV_THRESH_BINARY);
updateBG(gray_frame, BgImg_32, 0.005);
BgImg_32.convertTo(BgImg, CV_8UC1);
FrImg_32.convertTo(FrImg, CV_8UC1);
FrImg_src_32.convertTo(FrImg_src, CV_8UC1);
drawRect(frame, FrImg);
// imshow(“src”, frame);
// imshow(“back”, BgImg);
// imshow(“force”, FrImg);
// imshow(“forcesrc”, FrImg_src);