机器视觉系统由众多部件组成,其中包括相机、图像采集卡、照明单元、光学元件与镜头、处理器、软件及显示设备等。简单的机器视觉系统可以识别2D或3D条形码,更复杂的系统可以确保检测的元件满足特定的容差要求、组装正确、没有缺陷。
很多机器视觉系统配备了采用不同类型图像传感器的相机(如表1所示)。为了确定相机可获得的分辨率,重要的是理解这些传感器可以分辨的每毫米线对数(lp/mm) ,而不是有效的像素点数。
    例如,在一个典型的2588×1958像素、500万像素成像器中,大小为1.4μm2的像素可提供357lp/mm的分辨率;而一个640×480像素的VGA成像器,其像素大小为5.7μm2,可实现88lp/mm的分辨率。对于具有相同尺寸的成像器而言,像素越小,每毫米中就可分辨更多的线对数。
    如果一个特殊的图像传感器包含3μm2的像素,那么根据尼奎斯特采样定律,理论上图像中可以被分辨的小特性尺寸为6μm。然而实际应用中,并不能达到这一小尺寸值,因为每个镜头都会产生一定程度的像差。
    灰度图像通常会按每像素8比特存储,从而提供256个不同的灰度渐变。图像中的黑色特性对应更低数值;更亮的像素对应更高数值。这种方法很便捷,因为单一字节对应着单一像素。
    选择相机
    通常,机器视觉系统中使用的相机,可以通过USB3.0、以太网、FireWire、Camera Link及CoaXPress等接口将相机中捕捉到的图像传输到PC系统中。
    目前,集成机器视觉照明、图像捕捉及处理等功能的智能相机,正在为阅读条形码或检测部件是否存在等自动化视觉任务提供经济型解决方案。尽管智能相机的处理器性能或许足以满足这些任务的需求,但是更复杂或要求更高速度的任务则需要额外的处理能力。
    除了性能外,系统集成商还要决定采用何种支持软件以及相机如何连接到外部设备。尽管很多检测部件是否存在的应用中都采用了智能相机,但是一些其他应用可能需要将相机连接到显示设备,用以显示捕获到的图像和图像分析的结果。
很多智能相机的处理器运行专用的操作系统;也有一些智能相机运行Linux或Unix等商业操作系统。当然,这些相机可以运行任何可在PC上运行的软件包。
    照明元件
    通过配备正确的机器视觉照明系统,能以高对比度重复捕捉图像特征。如果照明的配备不正确,机器视觉系统的成功性、可靠性、可重复性和易用性都处于较大的风险中。为了确保机器视觉系统配备正确的照明元件,设计师需要咨询照明制造商,或借助图像照明实验室检测不同的照明选项。
    LED照明正在开始替代目前常用于机器视觉系统中的荧光灯、光纤卤素灯及氙气闪光灯光源,因为LED照明具有更高的一致性、更长的使用寿命和更好的稳定性。LED照明可以提供各种各样的色彩并能选通发光,这一特性在高速机器视觉应用中非常有用。
    除了照明类型,另一个决定图像成像的重要因素是光照到待测物体上的角度。两种常用的为物体提供照明的方式是:暗场照明和亮场照明。

    暗场照明从较低角度照明物体,在一个非常平滑的如镜面般的物体表面上,反射的光将超出相机的视野范围。物体的表面将呈现为黑色,而通过相机捕捉到的物体表面发光的部分,就对应着表面的缺陷或划痕。
亮场照明与暗场照明相反,亮场照明是在成像物体的上方打光,因此物体反射的光将处于相机的视场范围内。亮场照明配置中,物体表面上任何不连续处反射的光均无法被相机接收而显示黑色。因此,该技术被用于为漫发射的非反射性物体提供照明。
    色彩效应
    如果某个应用要求使用彩色相机,则需要白光照明待检测的元件。如果需要区分待检测元件的颜色,则白光需要在整个波长范围内产生平等光谱(equal spectrum),以便分析图片中的颜色。
    通过黑白单色相机也可以识别图像中的颜色,这种方法需要选择合适的灯光照明图像(如图2 所示)。图2中上面一行图片是人眼观察到的图像效果,而下面一行的图像则显示了单色相机呈现出的图像效果。

    为了照亮图像,使用了三种不同颜色的光:600nm红光(左侧)、白光(中间)和520nm绿光(右侧)。为了使该图像呈现出佳的对比度,好的方式是使用绿色光,因为绿色是红色的互补色。这种对比可以被单色相机轻松地识别出来。如果为了滤掉红色,则好采用红色光照亮物体。如果图片本身是五光十色的,并且不需要识别其中的任何一种颜色,那么白光照明则是更合适的选择。
    图像处理算法
    当应用算法处理图像时,请考虑开发人员和终端用户的技能及具体的视觉系统任务要求。
许多PC和智能相机供应商提供了功能大体相似的图像处理软件包。很多商业软件包提供了图形化集成开发环境(IDE),使系统集成商可以从程序库中拖取设计好的功能,根据自身需求实现定制化视觉算法。
    多数商业软件包要求为每个部署的视觉系统支付版权费,但是通过使用开源成像代码如OpenCV或直接用C++、C、C#或.NET编写应用程序,可以省去这一成本。
    但是,由于OpenCV是一个开源环境,没有制造商为其提供担保或支持。相比之下,商业软件用户的图像处理工具包将会得到开发商的支持。
    在选择软件前,系统集成商需要仔细评估自身的能力。尽管选择一个单一的基于PC的商业机器视觉软件包,需要支付800~2500美元的版权费用,但是开发人员使用C语言从头开始编程,也会很容易耗费掉大量时间和工程资源。
    此外,系统集成商还要认识到,通常一个开发环境并不能适用于所有的机器视觉系统。技术和经济压力意味着要根据不同的应用需求,采用不同的方法进行软件开发。
    在初步确定哪种算法适用于执行某个特定的视觉任务后(如图3所示),需要的系统数量、每个系统的成本和软件开发者的技能,将决定选择什么样的编程环境。例如,用C或C++等语言编写图像处理代码等相对更复杂更长的任务,是工程师开发大量系统时的一个更佳选择。

    算法类别
    图像处理算法可以分为不同的类别,用于满足不同的应用需求。
    通过图像数据的预处理,可以提取出图像的特性。图像阈值是图像分割算法中简单的方法之一,该方法可用于从灰度图像中生成二进制图像,从而让物体能够从背景中分离出来。
    其他的运算符,如图像滤镜可以令图像锐化、降低图像噪音;而直方图均衡可以增强图像的对比度。预处理同样涉及图像分割,以定位图像中具有相似属性的物体或物体边界,如颜色、亮度或材质等。
    更复杂的算法可以实现特征提取、检测物体边缘或物体转角,实现对图像中物体的测量。连通性工具,如blob分析算法,则可以测量图片内分散物体的有某种共同关系的特性参数。
    关联性与几何搜索是另外两个强大的搜索算法,其可用于找到物体的某种特性,或在新的图像中搜索同样的特性,可提供相应的位置、某些情况下的尺寸和规模、以及新图像是如何实现倾斜或转换的等信息。
     后要提及的是可以实现分类及图像破译的算法。其中,简单的是可以实现简单模板匹配操作的算法,而更复杂的分类算法可能用到神经网络及SVM等更复杂的技术。
    算法的应用
    在众多视觉系统中,决定一个元件或元件的某个特性是否存在非常重要。尺寸、形状或颜色等属性可以用于识别元件。对比分析、blob分析、模型匹配或几何搜索工具可以在图像上识别元件。
    为了将一个元件从其他元件中区分出来,可以使用相对简单的功能,如边缘检测算子。如果需要主播却地检测出元件的位置,则需要执行几何搜索或blob分析。
    为了高速检测元件或web上的缺陷,需要用到对比分析或模型图像匹配算子。如果需要将缺陷归类并检测,blob分析或边缘分析可以测量缺陷参数,并将其与已知的正常参数进行比较。
    在一些图像处理应用中,可以利用超过图像标准像素分辨率的精度,测量图像中的线、点或边缘的位置,获得子像素分辨率。这可以通过对比物体边缘像素的灰度级别与物体每个边上的像素灰度级别来实现。
    在特殊的例子中,可以使用极坐标抽取技术识别圆形物体的图像,这种方法更易于实现。如图5中间部分所示,blob分析被用于显示蓝色物体的参数细节。使用此类算子,可以更容易地检测尺寸、边界框及物体的中心。
     在图5右上图中,通过分析图片中的灰度值,边缘检测算法可以检测物体边缘、位置、形态或者角度。左下方的直方图显示了某个特殊图像的灰度像素值,该值将被进一步分析,以强化图像中获得的某些特性。
    中间的图像有两组光学特性需要检测,上面的特性被轻微减弱。在这个示例中,通过验证可以了解特性的衰减方式。此外,光学特性识别(OCR)软件可以用于读取衰减特性。
    在图5右下角,搜索算法从图像中锁定一个目标对象,并存储为模板或几何模型,之后在其他图像中寻找类似的目标图像,这就是一个可以识别特定特性的准确工具。
     策划、决定及执行
    在着手研发任何机器视觉检测系统前,需要仔细评估是公司内部开发还是将其外包。在策划阶段有时会发现,机器视觉系统可能并非必要的,或者并不可行。
    如果确定机器视觉系统可行,则具体检测过程的所有特性都需仔细记录。需要对元件待检测的物理及几何属性,包括颜色、表面抛光及反射属性等进行归类。开始,必须要定义特征用以区别待检测的元件是好是坏。只有了解元件或装配件的属性,系统集成商才能确定哪个图像解决方案是理想的。
    整个生产过程都需要进行分析,使系统集成商了解元件是如何被生产的、以及在检测过程中发生了什么变化。借助分析,甚至还可以确定是否应该在生产流程的初级阶段就采用视觉检测。
    当策划阶段完成后,机器视觉组件,包括相机、软件、照明元件、光学元件及镜头等都要确定下来。这一阶段将确定在生产环境中,是否有足够的分辨率或充分的照明及光学条件,以确保产生所需要的结果。这些因素好在编写系统说明时完成,而不要等到实现系统时再考虑。                                 
    在系统明确阶段,应该提供一份报告,详细列出使用的硬件及软件、系统必须要运行的检测功能、需要满足的容差及系统的吞吐量等。此外,该阶段还要考虑系统如何与生产厂房中可能存在的其他自动化系统连接,这些都要记录下来。
    在决定是自行研发、还是与外部系统供应商合作开发时,还需要考虑几个关键的业务问题。从项目一开始,系统集成商就要确定公司内部是否具备支持项目所需要的技术实力。
    如果公司内部拥有这样的技术实力,管理层还要确定具体负责该工作的个人是否有足够的时间和资源支持这一项目、是否会遇到意想不到的挑战?如何应对?等等。此外,如何维护、支持、服务及升级该系统也是需要考量的重要因素。