现在的位置: 首页 > 综合 > 正文

OpenCV1.0下移植OpenCV高版本函数

2012年07月09日 ⁄ 综合 ⁄ 共 1550字 ⁄ 字号 评论关闭

 

要做一个双摄像头定标项目,抄了Learning OpenCV上的代码,修改之后在VC6.0里面跑,却提示找不到cvStereoCalibrate这个函数。。。

网上一查,发现cvStereoCalibrate只有在OpenCV1.1之后的版本才有,遂去下载了个1.1… 却发现安装起来特别麻烦,而且不能在VC6.0里用(VC6.0之后的版本没怎么用过,不熟)。因为之前研究Adaboost的时候也修改过OpenCV源代码,于是动了移植代码的心。

 

首先在OpenCV1.1下找到cvStereoCalibrate,在cv/src/cvcalibration.cpp中,把整个函数移到OpenCV1.0里的cvcalibration.cpp中。

然后进入配置好的VC6.0,打开OpenCV1.0目录下的_make/opencv.dsw工程,编译->批构建,把除了cv-Win32 Release cv-Win32 Debug之外的勾全部去掉,然后点击建造(Build),如下图所示

 

 

之后编译器就会报一大堆错误,显示cvStereoCalibrate函数中调用了哪些函数1.0里面没有,然后到1.1中一一找到,一一Ctrl+C, Ctrl+V到1.0的文件中。

提下主要的几个函数:一个是CvLevMarq类,类的定义要从cv.h中拷,还有几个宏,也需要到cv.h中拷。。。

另一个比较麻烦的就是cvCompleteSymm,这个函数在OpenCV1.0中是在ml库中定义的,在cv库中重新定义好像会重新出错。我的方法是把这个函数重命名成cvCompleteSymm1,然后在要调用的地方把函数名改一下,成功

 

还有一个问题是由于VC编译器过老,不支持函数调用时参数小于原定函数的应用,我的办法就是在后面补充零

 

修改好这些之后,再 编译->批构建,生成新的cv100.dll

 

到程序里跑,可是还是出现错误说没有找到cvStereoCalibrate…

 

于是我把修改时的添加代码重新复制到一个新的头文件里,在编译时重新引用这个头文件,但由于OpenCV有几个内部宏不能在外部引用,这种方法还是不成功

 

最后,我想到了搜索cvCalibrateCamera2这个函数,这个函数在OpenCV1.0之下有,我想通过这个函数看看OpenCV中函数的定义是不是还有什么其他规律。结果果然不出所料,这个函数在cv.h中还有一个头定义。。。

 

一瞬间恍然大悟,原来每个外部调用的opencv函数都要在相关的头文件里定义(常识嘛)。。。将cvStereoCalibrate的头定义也从1.1的cv.h拷到1.0的cv.h,然后重新批构建。再打开自己的三维定标的工程,Ctrl+F5,终于编译成功。

*************************************************

PS:今天跑了一下,还是不成功,究其原因,发现原来1.1和1.0下对distortion matrix的维数定义不一致,1.1下是5x1或者1x5,而1.0下是4x1或者1x4,由于cvStereoCalibrate会用到cvCalibrateCamera2, 所以运行时函数会报错,只要把cvStereoCalibrate中Dist[k] = cvMat(1,5,CV_64F,dk[k]);改成1,4再重新批购建就可以了

 

 

 

结语:之后又移植过Rectify和FindCorresponse的几个函数,用的也是相同的做法。当然这种方法不值得广泛推荐。但我觉得这样对理解OpenCV内部结构有很大的好处,至少能让你清楚这个库是怎么构建的,也可以清楚OpenCV的编程风格。特别是对于我这种将来要做算法硬件加速的人来说,了解其内部构造是必须的。

 

 

抱歉!评论已关闭.