2009年10月1日,OpenCV2.0发布,这标志着革命性的OpenCV2时代的来临。OpenCV2带来了全新的C++接口,将OpenCV的能力无限放大。在2.0的时代,OpenCV增加了新的平台支持,包括iOS和Android,通过CUDA和OpenCL实现了GPU加速,为Python和Java用户提供了接口,基于Github和Buildbot构建了充满艺术感的持续集成系统,所以才有了被全世界的很多公司和学校采用的稳定易用的OpenCV 2.4.x。
-
项目架构的改变
OpenCV是一个相对于整体的项目,各个模块都是以整体的形式构建然后组合在一起的。然而,随着功能的增加,OpenCV主体集成了各种各样的功能模块,变得越来越臃肿。而3.0的出现,就是为了给日益发福的OpenCV减肥,因为OpenCV3决定像其他大项目一样,抛弃整体架构,使用内核十插件的架构形式。
在GitHub中,除了存放着正式版OpenCV的主仓库和新增加的“opencv_extra”仓库以外,OpenCV3.0中还添加了一个名opencv_contrib的全新仓库,这个新仓库中有很多让人兴奋的功能:包括脸部识别和文本探测,以及文本识别、新的边缘检测器、充满艺术感的图像修复、深度地图处理、新的光流和追踪算法等。
opencv的主仓库地址:https://github.com/itseez/opencv
opencv_extra仓库地址:https://github.com/itseez/opencv_extra
opencv_contrib仓库地址: http://github.com/itseez/opencv_contrib正式版opencv与opencv-contrib之间的区别如下:
- 两者都由OpenCV官方开发团队持续集成系统维护,虽然目前opencv_contrib仓库中的代码测试并没有完成,很多功能不稳定。
- 主体的opencv在GitHub中由ltseez提供,其有着非常稳定的API以及少部分的创新。
- opencv-contnb仓库是大多数实验性代码放置的地方,一些API可能会有改变,一直会欢迎广大开发者们贡献新的精彩算法。
- opencv_contrib中的这些额外模块可以在CMake中用OPENCVEXTRA_MODULESPATH=/moduIes传递给CMake文件,和OpenCV3主体中的代码一起编译和运行。
- opencv_contrib的文档是自动生成的,可以在http://docs.opencv.org/master/中找到,并会在随后的版本中更加完善。
-
将OpenCV2代码升级到0penCV3报错时的一些策略由于OpenCV3的主体部分只是在OpenCV2的基础上进行小幅度的史改,所以我们会发现不少OpenCV2下廾发的程序仍然可以在OpenCV3中正常编译运行。
然而,有一些版本升级导致的改变则会让我们在OpenCV2下开发的程序在OpenCV3中报错。
1.〖问题一〗由于宏名称的变更照成的“未声明的标识符”系列问题有时候,遇到此类问题加入句"#include<cv.h>”便可以让OpenCV3也能认识一些"CV”前缀的宏,将问题解决掉。因为有不少OpenCVI的宏依然在OpenCV3的cv.h头文件中有定义。
症状:在OpenCV3的环境下运行OpenCV2中写的程序报"enorC2065:'CV_WINDOWAUTOSIZE,:未声明的标识符”系列错误。
分析:OpenCV3取消了OpenCV丨中残留的"CV_”式的宏前缀命名规范,对这些cv一前缀的宏使用了新的命名觌范。这里有几种情况要分类讨论。
(1)情况1:直接去掉"CV_”前缀
在这种情况下,比较典型的有如下一些函数。
1)namedWindow函数中,例如将CV_WINDOW_AUTOSIZE改为WINDOW_AUTOSIZE
2)threshold函数中,例如将CV_THRESH_BINARY改为THRESHBINARY
3)line函数等一系列绘图函数中,CV_FILLED改为FILLED
4)remap函数中,CV_INTER_LINEAR改为INTER_LINEAR
5)在鼠标操作函数SetMouseCaIIback中,将CV_EVENT_LBUITONUP改为EVENT_LBUITONUP、CV_EVENT_LBUTTONDOWN改为EVENT_LBUTTONDOWN、CV_EVENT_FLAG_LBUTTON改为EVENT_FLAG_LBUITON、CV_EVENT_MOUSEMOVE改为EVENT_MOUSEMOVE
7)HoughCircles函数中,将CV_HOUGH_GRADIENT改成HOUGH_GRADIENT
8)inpamt函数中,将CV_INPAINT_TELEA改为INPAINT_TELEA、CV_INPAINT_NS写作INPAINT_NS
9)matchTemplate函数中,将CV_TM_SQDIFF改为TM_SQDIFF、CV_TM_SQDIFF_NORMED改为TM_SQDIFF_NORMED
10)在imwrite函数相关使用中,将CV_IMWRITE_PNG_COMPRESSION改成IMWRITE_PNG_COMPRESSION
11)设置摄像头尺寸的时候,将CV_CAP_PROP_FRAME_WIDTH改为CAP_PROP_FRAME_WIDTH、CV_CAP_PROP_FRAME_HEIGHT改为CAP_PROP_FRAME_HEIGHT
(2)情况2:需要用新的前缀替换
在这种情况下,比较典型的有如下一些函数。
1)line函数等一系列绘图函数中,CV_AA改为LINE_AA
2)cvtCoIor函数中颜色空间转换系的宏,全替换为"COLOR_”前缀,如CV_BGR2HSV改为COLOR_BGR2HSV
3)normalize函数中,将CV_MINMAX改为NORM_MINMAX
4)morphologyEx函数中的宏,全部替换为“MORPH_”前缀,如CV_MOP_OPEN改为MORPH_OPEN
5)threshold函数中的宏,全部替换为"THRESH_”前缀,如将CV_THRESH_BINARY改THRESH_BINARY
(3)情况3:需要在新的命名空间中使用宏
在这种情况下,比较典型的有如下一些函数。
1)TermCriteria函数中,CV_TERMCRIT_EPS改为TermCriteria::EPS、CV_TERMCRITI_TER改为TermCriterta::MAX_ITER
2)CascadeClassifie::detectMultiScale函数中,CV_HAAR_SCALE_IMAGE改为CASCADE_SCALE_IMAGE
2.〖问题二〗使用vector容器之时提示“error C2065:“vecto产未声明的标识符”系列错误
症状:在OpenCV3的环境下运行OpenCV2中写的程序,使用了vector容器,而未包含STD命名空间,于是便会报"errorC2065:"vector”:未声明的标识符“系列错误。
分析:OpenCV3中并没有在头文件中使用标准程序库std的命名空间。所以遇到这个错误,在我们写的程序开头加上一句“using namespace std;"使用C++的标准命名空间即可解决问题。
上述两个就是OpenCV2代码升级OpenCV3时最常会遇到的问题。接下来,列举一些OpenCV3升级时一些其他的改动细节,以结束此节。
3.其他一些细节问题的解决方案
1)features2d.hpp头文件路径的更改。将#include<opencv2/nonfree/features2d.hpp>
改为#include<opencv2/features2d.hpp>
2)core.hpp头文件路徑更改。将#include<opencv2/core/core.hpp>改为#include
<opencv2/core.hpp>
3)用format进行格式化输出时,将format(r,“python”)改成format(r,Formatter::FMT_PYTHON)
4)定义尺寸时,将cvSize(-1,-1)改为Size(-1,-1)
5)在表示颜色时,将CV_RGB改为ScaIar在OpenCV的官方开发网站的更新日志页面,可以看到历代OpnCV官方详细的改动日志:http://code.opencv.org/projects/opencv/wlki/ChangeLog