文章目录
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时,形态学开操作后运动物体方块化严重。所以通过在形态学操作前,先将图片大小放缩为原来的两倍,开操作后再缩小图片为二分之一,可以有效缓解图像的方块化。