OpenCV 谈opencv的长处与短处:模板匹配,金字塔

http://blog.csdn.net/mr_vision/article/details/3999662

 

     opencv是一个开源的计算机视觉开发包,这已是众所周知的了,而且越来越多的人开始研究它了。但opencv的使用者还是以高校居多,企业用得比较少,而企业使用opencv也往往是借鉴它的一些算法。

 

      作为开源软件,opencv的优势就是在于它有400多个免费的图像处理函数,而且涉及的面很广,从图像处理到模式识别、从静态图像到运动视频、从二维平面到相机的三维标定以及三维重建,覆盖了机器视觉的大多应用领域。它的许多算法,也是做了很好的优化的,比绝大多数教科书(当然指国内的教科书)算法优化得好。而国内的教科书,很多时候连一个算法也没讲明白过,更不用说到优化了。所以,用好opencv的开发包,就是一个不错的教材。

 

     个人认为opencv可以作为教材的好处在于,一般教材中涉及到的图像处理的基本概念、理论,opencv中都有完美体现,比如说图像处理往往不得不提到的阈值分割、边缘提取这些基本常识,opencv里都提供了很好的算法来实现。而这些函数,光看参数就发现它们很容易理解,跟我们平时见到的差不多,如果让自己去实现算法,往往能跟它的效果接近。而且,作为开源,我们去分析它的源代码,对自己也是一种提高。

 

    举个很简单的例子,工业视觉中往往要用到模板匹配,opencv里其实也有这个功能,只是很多人不知道怎么去用。先说最简单的那个cvMatchTemplate函数吧,看看函数说明知道是做模板匹配的,但匹配了怎么得到匹配中心的数据呢,这就要靠你去分析。首先,调用这个函数后实际上做了什么你要明白。其实这个函数就是拿一幅图像跟模板图像在做比较,比较结果还是一幅图像,这幅图像只不过不是一幅单纯的灰度图像而已。如果你知道比较后变成的是一幅图像,你就明白了,这个模板匹配是什么意思了。因为是在找模板与图像的相似程度,所以比较结果后图像最亮的地方就是匹配最好的地方了,换句话说,就是匹配中心。知道这个了,还会不知道找一幅图像中存在多个目标对象怎么找吗?而且,也能知道怎么来计算二者的相似性大小了。

 

      cvMatchTemplate只不过是个灰度匹配,灰度匹配的特长就是精度高,因为是一个个像素点在比较。但缺点就是计算时间长,因为要计算的点多,一个个比较花费很长时间。如果我们从图像金字塔的角度,把模板和图像都降低分辨率来匹配,这样时间又能提高一个数量级。但问题是,分辨率要降低到多少是合适的。这就得有个理论问题了,往往很少人去研究这个问题。就如我们看一个东西,缩小到什么时候辨认不出是什么了的时候,就是分辨率的最小极限了。这个本人做过深入研究后发现,其实灰度图像的模板匹配,模板上的点能取到的最小值基本上是个定值(这个值是个常量,一般人我不告诉他,呵呵)。

 

       还有一个匹配的函数cvMatchShapes,估计能把这个函数用熟的人不多,其实这就是个形状匹配的,这个函数本身写的不错,但没有进行很好的优化,结果效果往往不让人满意,这就是作为开发的局限性,如果优化得太好了,那么很多工业应用就用不着再买其它的软件了。

 

     cvMatchContourTrees与cvMatchShapes都是一样,空有架子,但没有多大实际用处,还有一个是轮廓直方图比较的函数,这几个函数都是一样,内部优化很一般。

 

    OK,说完匹配,我们看看边缘提取,几个边缘提取算子写的不错,尤其是canny,其效果不比市面上的软件差。但canny算法的优化度还是不过,比较一下halcon,就会发现,人家用的其它边缘提取算法,效果都好得不得了,这就是优化问题。

 

     还有阈值分割,opencv的方式很单一,还有很多经典的分割算法都没有用到。这就是它的有限性。其实,opencv的算法处理速度很多时候要打一个折扣就在于,函数内部太多地方用到宏定义和读取一些没有用的函数申明和版本信息,这些无疑放慢了处理速度。开源的也就罢了,何必还计较那些个版权问题呢。

 

         还有的人说opencv里面的DLL和函数能不能改,简单的说,因为是开源的,你想怎么改就都行。本人曾因为要经常应用到里面的几个函数,因为它实在是没有怎么优化,于是就改了不少地方,然后重新编译,同样的好使。给客户做一个小系统,人家说不能看出是opencv做的,我说no problem,把opencv的dll重新命个名字,就叫客户公司名,这样就看不出来的了(一般外行是看不出的)

 

       再说说opencv如何来优化,其实优化的前提是你得读懂了人家的代码,算法上有的地方本来用不到好几个for循环的,你最好不用,有的地方用不着要浮点计算的,你也不需要用它,还有,多结合实际,这就能做到一个更好的优化。简单的说,opencv里Hough 变换来找圆和线,实际效果差得不是一般,你如果能从函数内部,把那些图像做个预处理,该平滑的平滑一下,该去掉不要的特征的地方去除一些,你再来Hough 变换一些,效果不只是好10倍。很多时候,算法是死的,人是活的,在使用这个函数前,你先对图像做些处理,让它在下一个函数处理的时候更接近理论上的条件,这样处理出来的结果肯定是大不一样的。



、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

目前基于Hausdorff  distance 的模板匹配已经广泛应用在图像匹配中,而相关的国外软件在模板匹配方面已经做得相当成熟和领先,而国内在自主研发的这方面还很薄弱。承臻图像工作室经过近一年的努力,先后实现了基于Hausdorff  distance 在matlab下的开发,能迅速匹配出目标物体的位置,精度高,速度快,能有效匹配出旋转,平移的目标物体,稳定性高。接着又在C++环境语言下编码通过,已用于实际应用中。在此之前,承臻图像工作室采用SIFT特征匹配来进行模板匹配,虽然其匹配能力强,对于旋转缩放都能很好的应对,但匹配速度较慢,这次基于Hausdorff  distance 的模板匹配研发成功,说明了工作室在这方面的实力和专业。

参考文献:

1、http://www-cgrl.cs.mcgill.ca/~godfried/teaching/cg-projects/98/normand/main.html#whatis

2、蒙特卡罗估计改进Hausdorff距离的景象匹配方法

3、基于Hausdorff距离的轮廓线匹配

4、一种改进的部分Hausdorff距离检测技术和遗传算法在图像匹配识别中的应用

5、基于Hausdorff距离的手势识别


没有更多推荐了,返回首页