opencv4学习笔记(5)-运动检测算法及参数设置

文章目录

1.运动检测原理
2.检测流程
3.程序代码
4.运行结果展示
5.相关参数选取

运动检测原理

通过读取前后两张照片,通过比较同一位置前后两像素点的差值,如果超过设定阈值,则认为在该点的图像发生了运动。

检测流程

1.摄像头读取每一帧图片
2.转换图片为灰度图
3.absdiff 将当前帧与上一帧做差值
4.threshold 设定阈值将差值图2值化
5.getStructuringElement设定kernel参数,运用morphologyEx形态学开操作,消除细小白点。
6.显示出结果图

程序代码

int Demo::move_demo()
{
	VideoCapture capture(0);
	Mat currentframe,previousframe,show_frame;
	int framenum = 0;
	while (true)
	{
		if (!capture.isOpened())
		{
			cout << "read video failure" << endl;
			return -1;
		}
		capture >> currentframe;
		framenum++;
		if (framenum == 1)
		{
			cvtColor(currentframe, previousframe,COLOR_BGR2GRAY);
		}
		if (framenum >= 2)
		{
			Mat currentframe1, currentframe2, currentframe3, currentframe4;
			cvtColor(currentframe, currentframe, COLOR_BGR2GRAY);//转化为单通道灰度图,此时currentFrame已经存了tempFrame的内容 
			absdiff(currentframe, previousframe, show_frame);//做差求绝对值  
			threshold(show_frame, show_frame, 20, 255.0, THRESH_BINARY);
			resize(show_frame, show_frame, Size(), 2, 2);
			Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));//椭圆形3x3内核
			morphologyEx(show_frame, show_frame, MORPH_OPEN, kernel, Point(-1, -1), 3);//形态学开操作
			resize(show_frame, show_frame, Size(), 0.5, 0.5);
			//显示图像  
			imshow("moving area", show_frame);
			currentframe.copyTo(previousframe);
		}

		waitKey(10);
	}
}

运行结果展示

当没有物体运动时,得益于程序相关参数的选取正确,图片非常干净:
在这里插入图片描述
当物体发生运动时,可以看到运动物体:
在这里插入图片描述

相关参数选取

1.threshold的二值化阈值选取,会直接影响到识别出来的运动像素点的多少。
2.getStructuringElement进行设定kernel参数时,卷积核的大小设定到最小3x3时,形态学开操作后运动物体方块化严重。所以通过在形态学操作前,先将图片大小放缩为原来的两倍,开操作后再缩小图片为二分之一,可以有效缓解图像的方块化。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值