点击下方“深度学习爱好者”,选择加p"星标"或“置顶”
摘自先进测控之家《长着眼睛的机械手》
课题摘要——
利用图像处理技术,在50*50CM的区域内识别出5枚硬币(硬币位置任意),并且控制机械手逐一拾取5枚硬币,然后把5枚硬币逐一叠放到指定位置(指定位置随机)。
图像处理过程详解
——LabVIEW Vision Assistant
硬币位置识别算法分析与设计
硬币的识别是本系统软件设计最为关键的一步,只有识别的稳定、精确才能控制机械手拾取硬币。硬币的最主要特征为圆形、银白色、直径约为25mm。设计识别算法时也是主要依据这几个特征进行选择相应的算法模块,才能很好的区分周围环境的杂物。处理的总思想:先采集含硬币的图片,进行一系列的滤波、分割、填补后把除圆形外的杂物排除,再用硬币模版搜索整幅图像来确定是否有和硬币一样大小的圆形。找到圆形后选择输出其中心坐标。下面详细介绍利用Vision Assistant来快速搭建识别硬币的算法,并输出像素坐标。
1.1 导入图片
打开Vision Assistant并单击左上角的图片按钮,导入一幅图片。
在图中我们可以看到五枚硬币,并且还有坐标轴、圆圈等杂物,总之现在的图像是杂乱的,如果用当前的图像直接去搜索硬币无法做到稳定,因为当光照等外部条件改变时背景的白色和硬币的白色在像素值上非常接近很难进行识别。为此在搜索硬币前必须进行一定的阀值滤波。把硬币外形显示出来,也就是靠颜色去匹配较难,但靠外形匹配容易而且稳定。
1.2 转换RGB
图片中的图像是RGB的,要先把图片转成单色的,这样更利于识别和后续算法的处理。在软件界面的左下部分的Processing Functions中单击选择Color。再选择Color Plane Extraction这一函数模块。
处理后我们看到硬币暗淡了许多,这样更有利于下一步的分割。
1.3 阀值滤波
在Processing Functions中选择Groyscale,再选择Threhold。该函数的功能是选择阀值以内的图像并且用红色表示出来。如下图所示。
在look for选择,默认是Bright Object,所以白色的背景变成了红色,也就是白色为选择处理的内容。硬币相对背景而言是较黑的,所以应该在此项选择Dark Object。
可以看到较黑的硬币变成了红色被选中,同时可以调节Threhold Range这一滑调控件来调节阀值,直到满足硬币被选中变红色这一要求为止。然后点击OK完成本步骤。这是点击OK后的效果图,
图中除硬币外还有很多的杂物也被标注红色了,这是不希望看到的。
1.4 移除小杂物
在processing function中选中Binary,再继续选中ADV.Morphology这一函数模块。这一函数包含移除小物体、大物体、补全图像漏缺等功能。进入界面后选中Remove small things ,选中后可以看到图中轴坐标上的阿拉伯数字被移除了。
1.5 移除边缘杂物
再选择一次ADV.Morphology这一函数模块,再点击Remove border object。把图像中的边缘去掉,去掉后的效果如下图所示。
1.6 补漏洞
再选择一次ADV.Morphology这一函数模块,再点击Full holes,从下图中可以看到,五枚硬币全部变为无漏洞的红色。至此五枚硬币的外形已经很完整的提取出来,下一步就是要判断这五个外形是不是要找的硬币。
1.7 二值化图像
在processing function中选择grayscale中的lookup table这一函数模块。该函数的功能为把图像进行二值化处理,最后输出像素为0或1的图像,便于后续处理。在弹出的界面中选择equalize这一选项,可以看到图像立即变成了黑白图像。白色部分即为刚刚被红色标出来的硬币轮廓。
1.8 查找圆形
这是整个图像处理中最为关键的一步,LabVIEW vision提供了很多方法来查找具有一定外形的物体,比如shape detection、pattern matching等函数。而本系统采用的是share matching这一函数,因为顾名思义这个函数的功能是根据给定外形去查找图像中是否有相同外形的物体。它的适应性更强更稳定。在processing functionz中选择share matching这一函数模块。
进入界面后单击create template,弹出选择界面,选择图中任意一个圆形作为识别的模版即可。然后单击finish,即可完成识别模版选择。
模版选择好后,自动识别出五枚硬币,并且用绿色方框标注出来,下方显示的是对应的硬币的中心坐标。例如第一枚硬币的中心坐标在图中蓝色方形取阅,它的中心x坐标为235,中心y轴坐标是94。如下图所示。
到这一步硬币识别已经成功了,但是坐标还没有输出给LabVIEW程序框图,后续的电机控制也就无法进行。为此必须选择坐标输出给后续的VI。
1.9 坐标输出
在右下方单击select controls这一控件,
进入界面后,再在Number of matchings和Shape report前打勾表示这两项内容为输出内容。最后电机Finish。
在程序框图中的最后为输出两个控件,一个是硬币数目,另一个是包含坐标信息的簇。至此,硬币识别的图像处理部分全部完成。
2.目标点识别算法分析与设计
目标点为一红色的长方块,它的识别与上一节介绍的硬币识别方法类似,只是第8步稍微有些差异,即把匹配的圆形改为方形即可。如下图所示。
3.利用图像闭环控制机械手算法设计
之前介绍的图像处理算法最后输出的坐标为像素坐标并不是真实的物理坐标,这样对于后面的电机控制非常不方便,因此在设计控制算法前先要进行坐标换算。考虑到图像的长宽像素不一样(长为720,宽576,从图像的左下角处可以读出),因此必须分开单独标定,先标定x轴方向再标定y轴方向。分以下步骤进行。
1)x轴像素标定。
打开overlay这个函数模块,该模块的功能为文字标注并且自动显示出文字所在的像素坐标位置。任取尺子上的两点A、B,记下A在尺子上的刻度(选择110MM),从图中左下角位置直接读出像素坐标(690,286) (这个坐标是可以改变的,当这个坐标改变时图像中的文字的位置也会改变。为了便于计算,同时为了刻度的均匀性减少图像畸变带来的误差,在选点时尽量选择靠近图像左右边缘的点,如图中的A点很靠近右边而且刚好是整数110MM的刻度);再记下B在尺子上的刻度(250MM),从图中左下角读出像素坐标(53,286)。
计算AB两点真实长度Lx=250-110=240mm,对应的像素坐标长度Lp=690-53=637。则可计算在x轴方向,每两个像素点的对应的实际长度Lpx=240/637=0.3767 mm/pix。
2)y轴的像素标定。
与x轴标定类似记录下y轴上的两点C、D坐标。如下面两张图所示,分别为C点刻度175mm,C像素坐标(284,27);D点刻度100mm,D点像素坐标(284,407)。
计算CD两点真实长度Ly=175-100=75mm,对应的像素坐标长度Lp=407-27=380pix。则可计算在y轴方向,每两个像素点的对应的实际长度Lpy=75/380=0.197 mm/pix。
3)建立坐标系。
以像素中心O(720/2,576/2)=(360,288)为原点,以x轴方向向右为正,以y轴方向向上为正建立xoy坐标系。则从图像处理后出来的像素坐标即可转换成真实的坐标。例如Z(x,y),则z的真实坐标Zx=(x-360)×Lpx=(x-360)×0.3767mm;Zy=(y-288)×0.197mm。
建立好坐标系后,在分析机械手的控制算法前,先分析下机械手控制模型。在下图中假设机械手平台上有一枚硬币A(x,y),则对应的在摄像头图像中的坐标为A’(x’,y’)。而当前时刻机械手上的电磁铁的位置在O’点。O’A’的距离即为要机械手与硬币的距离,也是要控制电机所走的距离,关于高度Z可暂时忽略。为了让机械手从O’点走到A’可以先把R轴伸长,再使θ轴转过一定的角度即可。
在之前写的硬件设计(长着眼睛的机械手(六))中可以知道R轴上的步进电机的步距为0.01mm,则R轴步进电机脉冲数n=x’/0.01;但在实际调试中并不止控制一次电机,而是把x’作为反馈控制量去控制R轴的电机,只要x’>2mm,就一直输出脉冲n给步进电机,直到x’<2mm。
在控制地盘θ轴上与R轴不相同,因为底盘为直流电机控制。想直接通过控制直流电机来使转盘转到一定的位置是不可能,而且还有考虑到转盘齿轮的行程差。为此必须采用实时闭环的方法而且要用脉宽的长短来控制电机的转速。在小区域内可以用y’近似去代替O’与A’的角度差,再用y’去控制直流电机的驱动时间。Y’有正负电机也能正反转。直到y’<5为止。
整个控制方法的核心在于,不管x’和y’具体值是多少,只要机械手不在硬币的正上方(也就是x’y’大于某个值)就不断去驱动电机,直到机械手很接近硬币的正上方为止。在机械手走到硬币的上方后,再控制Z轴的步进电机使之下降一定的距离,再使电磁铁得电即可把硬币拾取。
控制机械手到目标方块的上方也是类似的思路,根据图像中方块的位置坐标进行反馈控制电机,直到坐标在一定的范围内。再控制Z轴下降,下降到一定的高度后再释放电磁铁使硬币放下。