图像处理——过程全解析,配图超详细!-程序员宅基地

技术标签: 算法  计算机视觉  图像处理  深度学习  人工智能  

点击上方“小白学视觉”,选择加"星标"或“置顶


重磅干货,第一时间送达

摘自先进测控之家《长着眼睛的机械手》

课题摘要——

利用图像处理技术,在50*50CM的区域内识别出5枚硬币(硬币位置任意),并且控制机械手逐一拾取5枚硬币,然后把5枚硬币逐一叠放到指定位置(指定位置随机)。

图像处理过程详解

——LabVIEW Vision Assistant

  1. 硬币位置识别算法分析与设计

硬币的识别是本系统软件设计最为关键的一步,只有识别的稳定、精确才能控制机械手拾取硬币。硬币的最主要特征为圆形、银白色、直径约为25mm。设计识别算法时也是主要依据这几个特征进行选择相应的算法模块,才能很好的区分周围环境的杂物。处理的总思想:先采集含硬币的图片,进行一系列的滤波、分割、填补后把除圆形外的杂物排除,再用硬币模版搜索整幅图像来确定是否有和硬币一样大小的圆形。找到圆形后选择输出其中心坐标。下面详细介绍利用Vision Assistant来快速搭建识别硬币的算法,并输出像素坐标。

1.1 导入图片

打开Vision Assistant并单击左上角的图片按钮,导入一幅图片。

75db4e42c9e683329879af69a2629c83.jpeg

在图中我们可以看到五枚硬币,并且还有坐标轴、圆圈等杂物,总之现在的图像是杂乱的,如果用当前的图像直接去搜索硬币无法做到稳定,因为当光照等外部条件改变时背景的白色和硬币的白色在像素值上非常接近很难进行识别。为此在搜索硬币前必须进行一定的阀值滤波。把硬币外形显示出来,也就是靠颜色去匹配较难,但靠外形匹配容易而且稳定。

1.2 转换RGB

30c61a85752fb2354a72a03cddd6690e.jpeg

图片中的图像是RGB的,要先把图片转成单色的,这样更利于识别和后续算法的处理。在软件界面的左下部分的Processing Functions中单击选择Color。再选择Color Plane Extraction这一函数模块。

处理后我们看到硬币暗淡了许多,这样更有利于下一步的分割。

1.3 阀值滤波

在Processing Functions中选择Groyscale,再选择Threhold。该函数的功能是选择阀值以内的图像并且用红色表示出来。如下图所示。

82d14e73d04e73cc9e1b1459cde97b9c.jpeg

e7c35122c3d50f7a2ed08d6e0d3b08d6.jpeg

在look for选择,默认是Bright Object,所以白色的背景变成了红色,也就是白色为选择处理的内容。硬币相对背景而言是较黑的,所以应该在此项选择Dark Object。

bce7adb3b06e4b7fcbd4990043ac3baf.jpeg

可以看到较黑的硬币变成了红色被选中,同时可以调节Threhold Range这一滑调控件来调节阀值,直到满足硬币被选中变红色这一要求为止。然后点击OK完成本步骤。这是点击OK后的效果图,

b5b3cca73154d81a79b9ba3d6f9c034c.jpeg

图中除硬币外还有很多的杂物也被标注红色了,这是不希望看到的。

1.4 移除小杂物

在processing function中选中Binary,再继续选中ADV.Morphology这一函数模块。这一函数包含移除小物体、大物体、补全图像漏缺等功能。进入界面后选中Remove small things ,选中后可以看到图中轴坐标上的阿拉伯数字被移除了。

6a03b5483d774c2c4f2799e63f5d56f7.jpeg

1.5 移除边缘杂物

再选择一次ADV.Morphology这一函数模块,再点击Remove border object。把图像中的边缘去掉,去掉后的效果如下图所示。

13a4c38a2fbf1b77e5d09ed137c106ab.jpeg

1.6 补漏洞

 再选择一次ADV.Morphology这一函数模块,再点击Full holes,从下图中可以看到,五枚硬币全部变为无漏洞的红色。至此五枚硬币的外形已经很完整的提取出来,下一步就是要判断这五个外形是不是要找的硬币。

015170421f1bc0dc8d13cab0059ccc3b.jpeg

1.7 二值化图像

在processing function中选择grayscale中的lookup table这一函数模块。该函数的功能为把图像进行二值化处理,最后输出像素为0或1的图像,便于后续处理。在弹出的界面中选择equalize这一选项,可以看到图像立即变成了黑白图像。白色部分即为刚刚被红色标出来的硬币轮廓。

7cbe74812ba13f5c4141da1a9abf7f84.jpeg

1.8 查找圆形

这是整个图像处理中最为关键的一步,LabVIEW vision提供了很多方法来查找具有一定外形的物体,比如shape detection、pattern matching等函数。而本系统采用的是share matching这一函数,因为顾名思义这个函数的功能是根据给定外形去查找图像中是否有相同外形的物体。它的适应性更强更稳定。在processing functionz中选择share matching这一函数模块。

7d16c4816a68f7c3efc22e50e9d124dc.jpeg

进入界面后单击create template,弹出选择界面,选择图中任意一个圆形作为识别的模版即可。然后单击finish,即可完成识别模版选择。

d30416f72577d431e62471edd85c89ae.jpeg

模版选择好后,自动识别出五枚硬币,并且用绿色方框标注出来,下方显示的是对应的硬币的中心坐标。例如第一枚硬币的中心坐标在图中蓝色方形取阅,它的中心x坐标为235,中心y轴坐标是94。如下图所示。

55ec8fe4b57045a0f1f162c4bdbc0a6f.jpeg

到这一步硬币识别已经成功了,但是坐标还没有输出给LabVIEW程序框图,后续的电机控制也就无法进行。为此必须选择坐标输出给后续的VI。

1.9 坐标输出

在右下方单击select controls这一控件,

b5474361c5e3f49da9ab704fe206bb16.jpeg

进入界面后,再在Number of matchings和Shape report前打勾表示这两项内容为输出内容。最后电机Finish。

ee4b98703e80b927938f4058a04e67be.jpeg

在程序框图中的最后为输出两个控件,一个是硬币数目,另一个是包含坐标信息的簇。至此,硬币识别的图像处理部分全部完成。

9db903a8f902e0abe0af90f4d5e106b4.jpeg

2.目标点识别算法分析与设计

目标点为一红色的长方块,它的识别与上一节介绍的硬币识别方法类似,只是第8步稍微有些差异,即把匹配的圆形改为方形即可。如下图所示。

9294cd57344f1c225356a44f193439d8.jpeg

3.利用图像闭环控制机械手算法设计

之前介绍的图像处理算法最后输出的坐标为像素坐标并不是真实的物理坐标,这样对于后面的电机控制非常不方便,因此在设计控制算法前先要进行坐标换算。考虑到图像的长宽像素不一样(长为720,宽576,从图像的左下角处可以读出),因此必须分开单独标定,先标定x轴方向再标定y轴方向。分以下步骤进行。

1)x轴像素标定。

打开overlay这个函数模块,该模块的功能为文字标注并且自动显示出文字所在的像素坐标位置。任取尺子上的两点A、B,记下A在尺子上的刻度(选择110MM),从图中左下角位置直接读出像素坐标(690,286) (这个坐标是可以改变的,当这个坐标改变时图像中的文字的位置也会改变。为了便于计算,同时为了刻度的均匀性减少图像畸变带来的误差,在选点时尽量选择靠近图像左右边缘的点,如图中的A点很靠近右边而且刚好是整数110MM的刻度);再记下B在尺子上的刻度(250MM),从图中左下角读出像素坐标(53,286)。

cc7f35d7e38dfd10a2625db895704ae8.jpeg

6d2db6e4b4a91d779f4a3a772a52135d.jpeg

计算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)。

56595e85ecafd2f0022e12e73627712c.jpeg

57d7e302278378829777588df6aecdb2.jpeg

计算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轴伸长,再使θ轴转过一定的角度即可。

c992e8c26a84da07cda60b74ba21869c.jpeg

在之前写的硬件设计(长着眼睛的机械手(六))中可以知道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轴下降,下降到一定的高度后再释放电磁铁使硬币放下。

本文仅做学术分享,如有侵权,请联系删文。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42722197/article/details/131546354

智能推荐

华三SDN产业链分析-程序员宅基地

文章浏览阅读218次。为什么80%的码农都做不了架构师?>>> ..._h3c virtual converged framework切片

手把手教你开发第一个HarmonyOS (鸿蒙)移动应用_鸿蒙移动应用开发-程序员宅基地

文章浏览阅读1.9w次,点赞44次,收藏268次。AndroidIOSHarmonyOS (鸿蒙)文档概览-HarmonyOS应用开发官网2.1.1 系统的定位搭载该操作系统的设备在系统层⾯融为⼀体、形成超级终端,让设备的硬件能⼒可以弹性 扩展,实现设备之间 硬件互助,资源共享。对消费者⽽⾔,HarmonyOS能够将⽣活场景中的各类终端进⾏能⼒整合,实现不同终端 设备之间的快速连接、能⼒互助、资源共享,匹配合适的设备、提供流畅的全场景体验。⾯向开发者,实现⼀次开发,多端部署。_鸿蒙移动应用开发

AndroidStudio无代码高亮解决办法_android studio 高亮-程序员宅基地

文章浏览阅读2.8k次。AndroidStudio 升级到 4.2.2 版本后,没有代码高亮了,很蛋疼。解决办法是:点开上方的 File,先勾选 Power Save Mode 再取消就可以了。_android studio 高亮

swift4.0 valueForUndefinedKey:]: this class is not key value coding-compliant for the key unity.'_forundefinedkey swift4-程序员宅基地

文章浏览阅读1k次。使用swift4.0整合Unity出现[ valueForUndefinedKey:]: this class is not key value coding-compliant for the key unity.'在对应属性前加@objc 即可。或者调回swift3.2版本_forundefinedkey swift4

Spring Security2的COOKIE的保存时间设置_springsecurity 设置cookie失效时间-程序员宅基地

文章浏览阅读1.3k次。http auto-config="true" access-denied-page="/common/403.htm"> intercept-url pattern="/login.**" access="IS_AUTHENTICATED_ANONYMOUSLY"/> form-login login-page="/login.jsp" defau_springsecurity 设置cookie失效时间

view滑动冲突解决实战篇2(外部拦截法)_viewpage2外部拦截事件-程序员宅基地

文章浏览阅读1.1k次。继上篇内部拦截法需求还是跟上篇一样。只不过这次用外部拦截法来解决;只要在父容器添加如下代码就可以解决了滑动冲突,很简单,套模板就行 // 分别记录上次滑动的坐标(onInterceptTouchEvent) private int mLastXIntercept = 0; private int mLastYIntercept = 0; @Override public bo_viewpage2外部拦截事件

随便推点

Kotlin相关面试题_kotlin面试题-程序员宅基地

文章浏览阅读1.9w次,点赞26次,收藏185次。目录一.请简述下什么是kotlin?它有什么特性?二.Kotlin 中注解 @JvmOverloads 的作用?三.Kotlin中的MutableList与List有什么区别?四.kotlin实现单例的几种方式?五. kotlin中关键字data的理解?相对于普通的类有哪些特点?六.什么是委托属性?简单说一下应用场景?七.kotlin中with、run、apply、let函数的区别?一般用于什么场景?八.kotlin中Unit的应用以及和Java中void的区别?九.Ko_kotlin面试题

HEVC英文缩写及部分概念整理(1)--博主整理_反量化 英文缩写-程序员宅基地

文章浏览阅读2.8k次。有这个想法一方面是确实很多时候会记不得一些缩写是什么意思。另外也是受 http://blog.csdn.net/lin453701006/article/details/52797415这篇博客的启发,本文主要用于自己记忆 内容主要整理自http://blog.sina.com.cn/s/blog_520811730101hmj9.html http://blog.csdn.net/feix_反量化 英文缩写

超级简单的Python爬虫入门教程(非常详细),通俗易懂,看一遍就会了_爬虫python入门-程序员宅基地

文章浏览阅读7.3k次,点赞6次,收藏36次。超级简单的Python爬虫入门教程(非常详细),通俗易懂,看一遍就会了_爬虫python入门

python怎么输出logistic回归系数_python - Logistic回归scikit学习系数与统计模型的系数 - SO中文参考 - www.soinside.com...-程序员宅基地

文章浏览阅读1.2k次。您的代码存在一些问题。首先,您在此处显示的两个模型是not等效的:尽管您将scikit-learn LogisticRegression设置为fit_intercept=True(这是默认设置),但您并没有这样做statsmodels一;来自statsmodels docs:默认情况下不包括拦截器,用户应添加。参见statsmodels.tools.add_constant。另一个问题是,尽管您处..._sm fit(method

VS2017、VS2019配置SFML_vsllfqm-程序员宅基地

文章浏览阅读518次。一、sfml官网下载32位的版本 一样的设置,64位的版本我没有成功,用不了。二、三、四以下这些内容拷贝过去:sfml-graphics-d.libsfml-window-d.libsfml-system-d.libsfml-audio-d.lib..._vsllfqm

vc——类似与beyondcompare工具的文本比较算法源代码_byoned compare 字符串比较算法-程序员宅基地

文章浏览阅读2.7k次。由于工作需要,要做一个类似bc2的文本比较工具,用红色字体标明不同的地方,研究了半天,自己写了一个简易版的。文本比较的规则是1.先比较文本的行数,2.再比较对应行的字符串的长度3.再比较每一个字符串是否相同。具体代码如下:其中m_basestr和m_mergestr里面存放是待比较的字符串int basecount=m_basestr.GetLength(); int mergec_byoned compare 字符串比较算法