基于ROS+kinect+opencv的运动物体检测

前段时间学习了基于opencv的运动物体检测,现将学习经验分享如下。


一、原理


这次的运动物体检测用到了古月居大侠的代码然后稍加修改了一下,但整体功能没有太大变化。基于opencv的运动物体检测的原理为:先接收kinect发布的图像话题,将此接收到的RGB图像转换为opencv可处理的灰度图像,经过高斯滤波函数进行图像平滑处理后,获取该灰度图和前一张灰度图的灰度差值,若没检测到运动物体,则灰度差值为零;若检测到运动物体,则灰度差值不为零。
将得到的灰度差值图和阈值比较,若大于阈值,该像素点置为255(白色);否则置为0(黑色)。并根据白色区域求得面积以及每次检测中最大运动物体并用绿色框框住。


二、涉及到的opencv库函数详解


1、bridge.imgmsg_to_cv2()函数
该函数用于将ROS图像消息转换为opencv可以处理的图像形式。第一个参数为输入的图像;第二个参数为转换后的图像格式。更多格式如下图:
基于ROS+kinect+opencv的运动物体检测_第1张图片
2、cv2.cvtColor()函数
该函数为颜色空间转换函数。第一个参数为输入的图像;第二个参数为从转换前到转换后的图像类型。更多图像转换类型请参考下面网址:颜色转换格式类型。

3、cv2.GaussianBlur()函数
该函数为图像高斯滤波平滑处理函数,用于过滤图像的高斯噪声。第一个参数为输入的图像;第二个参数为高斯核的大小,一般取奇数或0;第三个参数为高斯的标准差。高斯核通俗理解就是一个二维带权矩阵,当用该高斯核扫描图像时,高斯核中点对应的图像的像素点的值为该高斯核每个权值与对应像素点乘积的和,用该和代替原来像素点的值,通过该方法可滤去高斯噪声。详细解析请参考下列文章:opencv图像平滑处理。

4、cv2.absdiff()函数
该函数用于获取两幅灰度图的差值,输出为灰度差值图像。若两个像素点的灰度值相同,返回0;若不相同,则返回差值的绝对值。第一个参数为第一幅灰度图;第二个参数为第二幅灰度图。

5、cv2.threshold()函数
该函数用于判断图像中某个像素点的灰度值是否大于某个阈值,若大于,则置为第三个参数;否则置为0。第一个参数为输入的图像;第二个参数为用于判断的阈值;第三个参数为当灰度值大于阈值时所设为的最大值;第四个参数为用于判断的算法,具体如下图(借用其他博客的图片)(其中dst(x,y)为判断后的(x,y)像素点的输出值,src(x,y)为判断前(x,y)像素点的像素值,thresh为阈值,maxVal为第三个参数值):
基于ROS+kinect+opencv的运动物体检测_第2张图片
6、cv2.dilate()函数
该函数用于对图像的膨胀操作。第一个参数为输入的图像;第二个参数为结构元素的方框;第三个参数为迭代次数。膨胀操作含义请参考该博客:opencv-膨胀、腐蚀、开闭操作。

7、cv2.findContours()函数
该函数用于边缘检测。第一个参数为输入的二值图像,不是灰度图;第二个参数为轮廓的检索模式;第三个参数为轮廓的近似办法。返回值有三个:第一个为返回的原二值图;第二个为轮廓边缘的点的坐标集合(相当于二维数组),需要注意的是,该值可表示多条轮廓;第三个为轮廓个数以及各个轮廓的四种属性。函数详细解析可参考该博客:边缘检测。

8、cv2.boundingRect()函数
该函数的详细解析请参考该博客:识别边缘。

9、cv2.rectangle()函数
该函数用于框住检测到的运动物体。其中第一个参数为输入的图像,为未处理的由ROS图像转换后的opencv图像;第二个参数为方框的左上角坐标;第三个参数为右下角坐标;第四个参数为方框的rgb颜色;第五个参数为方框的线宽。

到此,所用到的主要函数差不多都讲解完毕了,希望对大家有用。若大家有不明白的地方也可以留言讨论。

在这里将可运行的运动物体识别程序奉上,也希望大家用到:运动物体识别。

你可能感兴趣的:(ROS机器人,opencv)