2020年5月机器视觉工作阶段性总结

终于有时间可以好好整理一下这一阶段的学习和项目经历了,写此文章的目的是对自我的总结和针对下一阶段的目标做计划。

        从2019年10月份,开始深入接触机器视觉这个行业,因为本人有图像处理、深度学习、c++的基础,因此学习起来并不是很困难,主要使用的机器视觉软件是halcon软件,该软件在机器视觉开发中输入常用的软件,而且算子丰富,界面开发友好,开发效率很高,因此选择该软件进行机器视觉的开发,这里本人主要学习是先通过看一些视频,然后熟悉一下halcon软件,熟悉后就开始研究halcon的自带例程,然后结合项目进行设计算法,当然这里说起来很简单的,但是我是系统的对halcon有所理解后才开始开发的。在开发的过程中遇到了很多问题,如相机的sdk开发、运动板卡的开发、界面QT的开发、和机械手的标定、3D视觉系统的搭建、点云的处理以及通信、最后的视觉算法的优化和移植。整个过程学到了很多的知识,以前只是对算法有所了解,但是不知道有啥用,通过这个几个项目对算法有了更深的的理解,尤其视觉的方面的算法,例如相机标定的本质、机械手标定的本质、3D系统的搭建的原理和需要注意的事项等等都有了很深的认识和理解。下面简单的介绍一下,开发中间遇到的难点以及如何解决的。

        首先介绍一下机器视觉的开发流程:这里参考了一篇文章,并加入了一点自己的理解,如下:

总体项目流程:

需求分析: 

      一个项目主要包含

  1. 定位(①Blob分析(主要包括二值化、形态学处理、特征选择,受光照影响较大)、②模板匹配)、识别,包括二维和三维
  2. 缺陷检测
  3. OCR字符识别
  4. 测量类的项目这四个大方向包括二维和三维

方案设计:

       根据客户应用的场合不同,选择相应的镜头、相机、支架、光源及如何打光等


概要设计:

      软件架构体系,vc++联合halcon还是c#联合halcon等,还有算法流程,怎么通讯、怎么识别等


详细设计:

     每一个功能模块怎么做,包括图像采集模块、处理模块、包括算法模块,如何通讯等。通常将每个模块形成一个动态库,调用相应的接口函数即可,项目图像采集调用SDK也是调用动态库的过程。


常见的视觉项目中图像处理框架:

     针对二维情况如下:

 

  1. 采集图像
  2. 图像预处理:滤波、二值化等处理以克服图像干扰。
  3. 形态学或特征处理(深度学习的话,后面还要加上训练、识别)
  4. 显示
  5. 调试
  6. 测试、修改
  7. 交互给客户,让客户按照合同中的技术指标执行
  8. 维护
  9.   相机、镜头、光源的选型及打光也就是上面项目流程第二步方案设计的内容,这里推荐一本书《工程光学》,讲的比较详细。

    三维情况是:

  1. 3d系统的搭建(结构光法、TOF法、双目、DFF等)
  2. 获取视差图像,对其进行处理或者转换成点云
  3. 对视差图像或者点云进行进一步处理,如提取感兴趣的轮廓或者点、对点云进行处理或者滤波为重建进行准备工作
  4. 得到目标后进行处理或者重建,如,引导机械手工作、抓取、检测等等
  5. 显示
  6. 调试
  7. 测试、修改
  8. 交互给客户,让客户按照合同中的技术指标执行
  9. 维护

现在把我做的项目的困难进行总结:

     二维方面的算法就不细说了,无非就是一些图像的增强、平滑、去噪、分割、特征的提取等等内容即Blob分析,还有模板匹配等,难度不大,主要是应用方面比较灵活,需要了解开发的套路,这里直接看官方例程就好了,在开发算法前,还需要对相机的选型、光源的选型进行确定,然后对相机进行畸变矫正,这里大家需要理解矫正的本质原因是什么,还有明白矫正的过程和评价标准。算法如果开发好的话,那下面就是对界面进行开发,可以使用QT也可以使用MFC,这里界面开发需要注意的就是多线程问题,因为视觉算法处理是需要时间的,而摄像机的帧率是很快的,因此需要开启线程对相机的拍照和算法执行进行单独的处理进行,尤其是线程的应用大家应该多注意死锁问题,设计时需要考虑周到,以及发生异常如何处理等。然后开发相机的SDK,其实很简单,配合界面开发的程序进行移植就好了,所谓的SDK开发,就是相机厂家提供的接口函数,一般官方会提供一个界面操作自己家的相机,同时也会提供界面的模板,还会提供大量的例程,大家只需要研究一下例子就可以移植了,如开启相机,曝光量、曝光时间、增益、亮度等都可以通过接口函数进行设置的,这里主要注意的是SDK输出的默认图片的格式,厂家不同,格式会不同, 还有就是需要把输出格式的图片转换成halcon或者OpenCV可以处理的图片格式,只有这样,算法拿到图片后才可以处理。然后就是看看是否需要和机械手进行配合工作,如果需要机械手,则还需要对其进行标定,一般二维大多数使用的都是九点标定,其实不一定九个点,理解原理后你会发现,标定的目的就是得到一个仿射矩阵,通过矩阵把图像的座标变换到机械手座标下的座标,然后让机械手到达即可。有时候项目并不需要使用机械手,这时候可以使用运动板卡,运动板卡的开发和相机的SDK开发很类似,直接调用接口就可了,如果对这部分感兴趣,也了解伺服电机等电器,完全自己可以组合一个简易的机械手,因为机械手的本质也是这些东西,当然精度方面不同的。如果项目使用运动板卡,这里同样也是需要进行标定的,和机械手一个道理,只是更麻烦点,因为需要根据项目要求设计运动,然后对其进行标定,难度都不大。以上是进行定位、分拣、跟随等项目。如果是测量的话,halcon提供了很多的算子,精度可以做到很高,大家研究例程就好了,这里提醒大家一定要注意测量的世界平面的建立和目的,尤其是测量的类型。以上就是二维方面的学习总结,总的来说,难度不大,但是要求掌握的知识很多很杂,如果没有软硬件知识,可能会很难学习,但是不要着急,慢慢来吧,我大概学了一个半月就掌握了二维方面的开发。下面就简单的介绍一下三维视觉的开发。

     对于是三维视觉,其难度相比于二维上升了不止一个层次,但是对于我来说都是水到渠成的事,难度还好,还能接受,主要原因是研究生期间研究了大量的人工智能算法知识,对其抽象知识已经适应了,各方面能力都得到了提高,因此学习起来觉得不是很难,但是因为没有这方面的经验,因此也走了一些弯路,下面会一一分享。下面分享一个3D处理流程,是halcon官方提供的,大家查看一下帮助文档,研究一下就知道了,如下:

      三维视觉的开发 ,首选是你需要确定你选择什么样的方式进行获取3D信息,目前主流的几种方法结构光法、双目、多目、TOF、DFF等,通过这些方法获取三维的视差图像也就是深度信息,拿到深度视差后可以转换为点云,然后在对点云进行处理或者获取模板,对点云进行处理后,提取到感兴趣的轮廓或者点或者位姿,然后通过标定传给机械手,使其工作即可。首先对于3D信息的获取,我实现了两种方式,一种是结构光法即基于激光三角的3D信息获取系统,原理不说了,大家看论文把,不难理解都是基于简单的几何知识。从上图可以看看,基于激光三角的可以直接获取x,y,z的深度图片,进而可以转换为点云的3D模型,另外一种是双目立体视觉,该模型可以直接获取视差图像,然后转换为点云模型,同理还有其他的方法,这样这是3D视觉的前提,即获取点云数据,然后就是进行处理,有融合、匹配、切割、配准等等操作,很多和二维的算法很类似,因此学习时要多思考以前学过的东西。

    在搭建的过程中,遇到了很多问题,如在搭建激光三角时,与机械手进行联合标定时,老是出问题,当时对机械手还不是很了解,因此一直以为是视觉的原因,尝试了几次发现不是视觉的原因是机械手那边没搞清楚,我们知道机械手的表示方法是座标加欧拉角,但是欧拉角又分很多种形式,而我因为不知道这个知识点,一直以为都是x,y,z,所以标定的时候就按照这样标定,结果可想而知,怎么解决的呢?当时负责机械手的同事对这方面也不懂,没办法只有我来上了,然后研究了官方的手册,发现了欧拉角的表示方法这个问题,然后分析了halcon的代码,改了一下,然后进行标定,正确运行,由此可以发现,这个问题出现的本质原因在于我和同事对这方面都没有经验,导致走弯路,这次解决后,以后再使用机械手注意一下就好了,这就是经验。还有一个问题就是在二维平面中,我要提取圆的轨迹,然后让机械手跟随,但是大家都知道,如果相机镜头和被测物并不是完全垂直,那么拍到的照片提取的圆他不是一个圆,他是一个椭圆,机械手跟随也是椭圆。我的项目中就遇到这个问题,百度发现可以通过投影变换进行解决,我就研究了投影变换,这个知识点很难,没办法需要解决,慢慢也就理解了,但是halcon官方给的例子和网上的例子大多数都是基于4点法进行纠正的,而我的圆无法使用4点法进行纠正,所以在这里耽误时间了,因为没有人可以问,只能自己研究,耽误了很长时间,期间接着做其他项目,同时研究这个难点,在研究的过程中,halcon其实是提供了方法的,只是他不是针对这个领域,针对的测量的领域,大家都知道,在测量领域,如果相机镜头和测量对象不垂直,直接测量肯定是不准的,因此需要矫正,而halcon的人性化就体现了,提供了算子,把图像转换为世界平面,这个平面无相机畸变和透视畸变,也就是说,通过这个算子就可以把相机畸变矫正同时也把透视畸变矫正,透视畸变矫正就是把图像变换为严格垂直镜头。因此变换到测量的世界平面进行测量精确度可以保证,基与此,我把他直接应用到我的问题上,问题完美解决,同时从这里我学到了,对于不规则的图片进行透视畸变,先提取二维图像的位姿,通过位姿进行校正。从上面的解决问题可以发现,如果你遇到了问题,千万不要着急,别人肯定遇到过,只是你还不知道解决的方法,剩下的就是带着问题去学习就好了,这就是有工作经验的好处,,,,,。

       以上就是我最近几个月的学习总结和感想,当然过程肯定比我说的更坎坷,但是坚持下去,一段时间过后你会成长很快,目前三维方面的视觉还需要继续深入,尤其是精度方面的需要进一步学习和提高,下面计划一下后面几个月的目标。

      目前二维方面的算法应用已经没问题了,例如尺寸的测量、OCR的识别定位、匹配定位等项目都可以做了,而三维方面需要继续深入,目前在看几本书,理解一下理论知识,如《机器视觉》、《机器人视觉测量与控制》以及《视觉测量与方法》,其实这几本书讲的都差不多,好好理解一下。这几本书看完后开始看点云处理方面的书籍以及学习OpenCV和OpenGL两个开源库,然后深入研究点云的处理的方法和应用库PCL,然后在接触SLAM技术。当然这个期间会不停的做项目积累经验,遇到问题解决问题。这些实现估计半年左右应该可以完成。今天就到这里。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章