赞
踩
opencv3与opencv2区别(代码上的一些不同写法及避坑在最后)
2009年10月01日,OpenCV 2.0发布,这标志着革命性的OpenCV2时代的 来临。OpenCV 2带来了全新的C++接口,将OpenCV的能力无限放大。在2.0的 时代,OpenCV增加了新的平台支持,包括iOS和Andriod,通过CUDA和OpenCL 实现了 GPU加速,为Python和Java用户提供了接口,基于Github和Buildbot 构建了充满艺术感的持续集成系统,所以才有了被全世界的很多公司和学校所采用的稳定易用的OpenCV 2.4.x。
2014年8月21日,OpenCV 3.0 Alpha发布,宣告着OpenCV3时代的登场。 官方更新日志中提到,OpenCV在3.0中改变了项目架构的方式,所以3.0时代不 会有像2.0时代一样激进的尝试,只会有足够稳定的改进。且不说更多眼花缭乱 的新特性,项目架构的改变是OpenCV3或为重大的革新之处。
将OpenCV2代码升级到OpenCV3报错时的些策略
由于OpenCV3的主体部分只是在OpenCV2的基础上进行小幅度的更改,所以我们会发现不少OpenCV2下开发的程序仍然可以在OpenCV3中正常编译运行。
然而,有一些版本升级导致的改变则会让我们在OpenCV2下开发的程序在
OpenCV3中报错。本节,让我们将这些知识点聚在一起做一个列举,供大家在把基于OpenCV2的代码升级到OpenCV3时查阅。
1.【问题一】由于宏名称的变更照成的“未声明的标识符”系列问题;
有时候,遇到此类问题加入一句"#include<cv.h>“便可以让OpenCV3
也能认识一些“CV_前缀的宏,将问题解决掉 因为有不少OpenCV1
” 的宏依然在OpenCV3的cv.h头文件中有定义。
症状:在OpenCV3的环境下运行OpenCV2中写的程序,报“error C2065:‘CV_WINDOW_AUTOSIZE’:未声明的标识符”系列错误。
分析:OpenCV3取消了 OpenCVl中残留的“CV_”式的宏前缀命名规范,
对这些CV一前缀的宏使用了新的命名规范。这里有几种情况要分类讨论。
(1)情况1 :直接去掉“CV_”前缀
在这种情况下,比较典型的有如下一些函数。
I )namcdWindow 函数中,例如将 CV_W1NDOW_AUTOS1ZE 改为 WINDOW. AUTOSIZE.
2) threshold 函数中,例如将 CV_THRESH_BINARY 改为 THRESH_BINARY。
3) line函数等 系列绘图函数中,CV_FILLED改为FILLED.
4) remap 函数中,CV_INTER_LINEAR 改为 INTER_L1NEAR.
5)在收标操作函数 SctMouscCallback 中,将 CV_EVENT_LBUTTONUP 改为 EVENT_LBUTTONUP 、 CV_EVENT_LBUTTONDOWN 改为 EVENT_ LBUTTONDOWN.CV_EVENT_FLAG_LBUTTON 改为 EVENT_FLAG_ LBUTTON、 CV_EVENT_MOUSEMOVE 改为 EVENT_MOUSEMOVE.
7) HoughCircIcs 函数中,将 CV_HOUGH_GRADIENT 改成 HOUGH_ GRADIENT。
8) inpaint 函数中,将 CV INPAINT_TELEA 改为 1NPAINT_TELEA. CV_ INPAINT_NS 写作 INPAINT_NS.
9) maichTemplate 函数中,将 CV_TM_SQDIFF 改为 TM_SQDIFF、CV_TM_ SQDIFF_NORMED 改为 TM_SQDIFF_NORMED.
10)在 imwrite 函数相关使用中,将 CV 1MWRITE_PNG_COMPRESS1ON 改 成 IMWRITE_PNG_COMPRESSION.
10)设置摄像头尺寸的时候,将CV_CAP_PROP_FRAME_W1DTH改为 CAP_PROP_FRAME_WIDTH , CV_CAP_PROP_FRAME_HE1GHT 改为 CAP_ PROP_FRAME_HEIGHT.
(2)情况2:需要用新的前缀替换
在这种情况下,比较典型的有如下一些函数.
(3)情况3:需要在新的命名空间中使用宏
在这种情况下,比较典型的有如下一些函数。
1)TermCriteria 函数中,CV_TERMCR1T_EPS 改为 TermCriteria::EPS、 CV_TERMCR1T_ITER 改为 TermCriteria::MAX_ITER
2) CascadcClassifier::detectMultiScale 函数中,CV_HAAR_SCALE_IMAGE 改为 CASCADE_SCALE_IMAGE.
2 .【问题二】使用vector容器之时提示“error C2065: “vector”:未声明的标识符” 系列错误
症状:在OpenCV3的环境卜运行OpenCV2中写的程序,使用/ vector容器, 而未包含STD命名空间,手是便会报"error C2065:“vector”:未声明的标识符"系列错误.
分析:OpenCV3中并没有在头文件中使用标准程序库std的命名空间.所以 遇到这个错误,在我们写的程序开头加上 徇“using namespace sld;”使用C++的 标准命名空间即可解决问题.
上述两个就是OpenCV2代码升级OpcnCV3时坡常会遇到的问题。接下来, 列举些OpenCV3升级时些其他的改动细节,以结束此节.
3 .其他一些细节问题的解决方案
1 )features2d. hpp 头文件路径的更改.将#include <opencv2/non free/ features2d.hpp>
改为#include <opcncv2/fcaturcs2d.hpp>
2 ) core.hpp 头文件路径更改.将#include <opencv2/core/core.hpp>改为#include <opcncv2/corc.hpp>
3 )用format进行格式化输出时,将format(r,“python”)改成format(r,Formatter::FMT_PYTHON)。
4)定义尺寸时,将cvSize(-1,-1)改为Size(-1,-1)。
5)在表示颜色时,将CV_RGB改为Scalar.
部署上避坑点
1
vector<int>cpmpression_params;//opencv2写法
compression_params.push_back(CV_IMERITE_PNG_COMPRESSION);
//opencv3写法
compression_params.push_back(100);
//图像压缩参数,该参数取值范围为0-100,数值越高,图像质量越高
Opencv输出时
Mat r=Mat(10,3,CV_8UC3);//建立十行 三列 的Mat容器数组,一个数值为BGR三种参数[(b,g,r),(b,g,r),(b,g,r)] 注Scalar参数特性。
randu(r,Scalar::all(0),Scalar::all(255);//使用randu产生随机值来填充矩阵。
cout<< "opencv风格" <<r<<";"<<endl<<endl;
cout<<"python风格" << format(r,"python") <<";"<<endl<<endl;//Opencv2写法
cout<<"python风格" << format(r,Formatter::FMT_PYTHON) <<";"<<endl<<endl;//Opencv3
2
当调用opencv 出现以下报错时
3 IntelliSense: 无法打开 源 文件 “opencv2/core.hpp”
4 IntelliSense: 无法打开 源 文件 “opencv2/imgproc.hpp”
5 IntelliSense: 无法打开 源 文件 “opencv2/calib3d.hpp”
6 IntelliSense: 无法打开 源 文件 “opencv2/highgui.hpp”
**请检查自己时opencv3还是2,上面时opencv3的写法,如果自己安装的时opencv2就会报错。**
当使用opencv2时正确头文件路径
#include <opencv2/core/core.hpp>
#include “opencv2/imgproc/imgproc.hpp”
#include “opencv2/calib3d/calib3d.hpp”
#include <opencv2/highgui/highgui.hpp>
参考资料
OpenCV3编程入门 (毛星云著)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。