APP下载

基于OpenCV的角铁中线检测方法

2010-04-26陆小龙

中国测试 2010年3期
关键词:中线图像处理标定

赵 霞, 陆小龙, 廖 明

(1.四川大学制造科学与工程学院,四川 成都 610065;2.四川航天计量测试研究所,四川 成都 610100)

1 引 言

铁塔攀爬机器人的爪子使用的是电磁铁,因此在攀爬铁塔的过程中如何使爪子准确无误的吸附到角铁上是机器人是否可以顺利进行攀爬的关键性因素。在机器人两爪部,圆形电磁铁的外侧各安装了一个USB摄像头。摄像头的对称轴与电磁铁爪子的对称轴平行,所以只要拍摄到的角铁两边缘的中线与摄像头视场的中线相重合,就说明爪子已经与角铁的位置对正,可以进行吸附。这里采用了Sobel算子进行边缘检测,以OpenCV为平台,在VB.net环境中进行了编程,成功提取了角铁的边缘和中线,验证了算法的有效性。

2 OpenCV简介与使用

2.1 OpenCV简介

OpenCV(Intel Open Source Computer Vision Library)是由Intel公司1999年研制开发的开源计算机视觉函数库,拥有包括300多个C函数的跨平台中、高层API。使用时可以大大减少开发者的编程工作量,具备强大的图像和矩阵运算能力,方便灵活的用户接口,主要用于对图像进行一些高级处理,比如说特征检测与跟踪、运动分析、目标分割与识别以及3D重建等,同时支持Windows、Linux平台,也可以移植到嵌入式开发平台。且OpenCV不依赖于外部库,对于商业和非商业的用户都是免费的。

OpenCV相比Matlab的图像库,最大优点是速度比较快,具有较高的实时操作性。它的底层是C和C++编写的,有一定的灵活性,能和许多编译器结合使用,所以它的应用越来越多。在经历了Matlab图像处理运算的慢速度之后,很多情况下都可以使用OpenCV,这样会更有效率,为数字图像处理提供了极大的方便,具有了更广阔的应用前景。

2.2 OpenCV在Visual Basic.net中的使用

许多对OpenCV的使用介绍都是基于VC++或者C,其实OpenCV同样可以在.net框架下使用。下面简单介绍OpenCV在VB.net中如何使用。

首先,下载并安装Visual Studio 2005和OpenCV的同时下载解压压缩包Emgu.CV.Binary-1.5.0.1。EmguCV封装了OpenCV image processing library,透过EmguCV,就可以在VS2005中使用OpenCV;其次,将Emgu.CV.Binary-1.5.0.1文件夹中的Emgu.CV.dll、Emgu.CV.ML.dll、Emgu.CV.UI.dll、Dmgu.Util.dll、ZedGraph.dll和Zlib.net.dll六个动态链接库加入到资源解决方案的引用中;最后,将EmguCV的控制项加载到工具箱中。进入菜单,工具->选择工具箱项目->.net Framework元件->浏览,进入Emgu.CV.Binary-1.5.0.1文件夹,选择Emgu.CV.UI.dll。之后工具箱中会出现ImageBox、HistogramCtrl两个选项。

经过以上三个步骤,就已经完成了将OpenCV嵌入到.net框架中去,接下来就可以利用OpenCV中的函数在VB.net中编写代码进行图像处理的工作了。

3 边缘检测

所谓边缘是指其周围像素灰度有跳跃变化的那些像素的集合。边缘广泛存在于物体与背景之间、物体与物体之间、基元与基元之间。因此它是图像分割所依赖的重要特征[1]。该文需要检测的就是物体与背景之间的边缘,也就是角钢与背景之间的边缘,将角钢与背景分离开来。

OpenCV中用于边缘检测的函数有两个,Sobel函数和Canny函数。Sobel算子属于梯度算子[2],且结合了Gaussian平滑微分,所以其结果或多或少对噪声有一定的鲁棒性[3]。Canny算法使用了拉普拉斯算子,该方法与其他边缘检测方法的不同之处在于:它使用两种不同的阈值分别检测强边缘和弱边缘,并且仅当弱边缘与强边缘相连时才将弱边缘包含在输出图像中。因此这种方法较其他方法而言不容易被噪声“填充”,更容易检查出真正的弱边缘[2]。图1是即将被检测的灰度图像。经实验对比两种算法,如图2和图3所示。

由图2和图3可以看出,虽然用OpenCV中的Sobel函数进行的边缘检测得到的不是二进制图像,但检测的结果是检测所需要的角铁的两条边缘,很清晰地与背景分离开来了。而Canny算法因为其检测的完整性实现而把角铁表面和背景上的一些不需要的杂散点也检测了出来,这些杂散点影响了后续的两边缘中线的检测。因此选用Sobel函数做为边缘检测的函数。

但是OpenCV中的Sobel函数进行边缘检测之后的效果是灰度图像,需要对其进行二值化。由于角铁特殊的结构,造成对其用Sobel函数进行边缘提取以后,两条边缘一个黑一个白。为了使二值化之后两条边缘全部保留,在进行二值化之前先将黑色的边缘转换成白色,再对整幅图进行二值化。转换之后的结果如图4所示。

4 提取中线

经过以上的边缘提取之后,就要进行提取中线。提取中线采取的方法是:

(1)取点的条件。一行中,可以取到两个点,并且这两个点的间隔要大于某个值。为了提高速度,不遍历图像所有点,而是从图像上半部开始符合条件的一行取左侧边缘上的一点,间隔一定的距离后在同一行右侧边缘上取一点,算出两点的中点的坐标值。

(2)用同样的方法在图像的下半部的左右两边缘分别取两个点,算出这两个点的中点的坐标值。

(3)连接两个中点,即得出两边缘的中线。画出中线,如图5所示。

(4)计算该中线与y方向的夹角度数,由此可以给控制爪子的电机发出指令,使其转动相应的度数,从而使爪子与角铁位置对正。

在实验中机器人攀爬过程中采集到的图像如图6所示,经过边缘检测过后如图7所示,仍然有很多杂散点存在,但是这并不影响角铁中线的提取的结果,该算法可以避开杂散点实现中线的检测。

5 标 定

由图6和图7可知,角铁的区域在视场内占的范围很大,很有可能在检测的过程中视场中只出现一条边缘,这样就必须对摄像头进行标定,才能在出现一条边缘的情况下正确的判断出角铁的中线。

标定分 2 种方法[3]:(1)经典的标定方法;(2)自标定方法。经典的标定方法是在一定的摄像机模型下,基于特定的条件例如形状尺寸己知的标定物,经过图像处理的手段,利用一系列数学变换和计算方法,求取摄像机模型的内部参数和外部参数。这里采用一个简单的方法进行标定。在爪子吸附在角铁上的时候,摄像头离角铁的距离是一定,角铁的宽度是一定的,只要保持摄像头的焦距,也就是参数不变,那么在视场中显示出的角铁的宽度所占的像素值也是不变的。

当检测出只有一条边缘时,先利用未进行边缘检测的灰度图判断没有检测出的那条边缘在已检测边缘的哪一侧。取图像左上角的第一点灰度值,如果灰度值在角铁的灰度值范围内,表明未检测出的边缘在已知边缘的左侧,反之,未检测出的边缘就在已知边缘的右侧。再计算已检测出的边缘的斜率,之后就可以根据已知的角铁宽度像素值找出角铁的中线。结果如图8~图11所示。

6 结束语

通过对图像处理和OpenCV开源软件包以及VB.net的研究,合理编写了角铁边缘检测和中线提取的算法,并在实验中验证了算法的合理和有效性,基本实现了功能。但是还存在一些问题,例如,算法的实时性不好,速度还不够快,还需要今后的进一步优化。

[1] 周 婷.基于OpenCV的移动靶面图像识别算法研究[D].大连:大连海事大学,2008.

[2] 徐 飞,施晓红.MATLAB应用图像处理[M].西安:西安电子科技大学出版社,2002.

[3] 陈小天.摄像机标定技术[D].长沙:国防科技大学,2003.

[4]Bradski G,Kaehler A.Learning OpenCV[M].The United States of America:O’Reilly Media,Inc.,2008.

[5]Sonka M,Hlavac V,Boyle R.图像处理与机器视觉[M].北京:人民邮电出版社,2009.

[6] 孙 颖,庆 生,陈 静.一种基于OpenCV的飞机跑道及地平线检测算法[J].智能交通,2009(3):190-191.

[7] 李振华.基于CMOS的视频采集及边缘检测系统的研究[D].武汉:武汉理工大学,2007.

[8] 吴晓阳.基于OpenCV的运动目标检测与跟踪[D].杭州:浙江大学,2008.

[9] 孙观宏,刘 江,李忠涛,等.基于OpenCV的图像采集及激光线形提取程序的开发方式 [J].机械制造与研究,2008,37(2):53-55.

[10]连 静.图像边缘特征提取算法研究及应用 [D].长春:吉林大学,2008.

猜你喜欢

中线图像处理标定
人工智能辅助冠状动脉CTA图像处理和诊断的研究进展
使用朗仁H6 Pro标定北汽绅宝转向角传感器
基于ARM嵌入式的关于图像处理的交通信号灯识别
CT系统参数标定及成像—2
CT系统参数标定及成像—2
基于图像处理的机器人精确抓取的设计与实现
课本内外
机器学习在图像处理中的应用
课本内外
——书写要点(三)
课本内外