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

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

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


重磅干货,第一时间送达

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

课题摘要——

利用图像处理技术,在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

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search