opencv发展到现在,中间经历了若干版本,保持了向下兼容。实际项目中也不断采用新的版本。
这就存在一个问题,如何把旧的项目代码中的opencv版本无缝升级到新的版本呢?
版本的升级主要有三个方面,include、lib、bin。
在VC环境下:
1. 关于include,一般是通过修改头文件附加引用目录的方式基本就能解决;
2. 对于bin,可以直接把新版本的.dll文件复制到运行目录;
3. 对于lib,和include类似,首先要做的一般也是通过修改库文件附加引用目录,让编译器能够找到新版本的.lib文件,但是还需要在“工程”中修改库的版本,比如当前我用的2.3.1,要升级到2.4.9,就需要把"opencv_highgui231.lib" 替换为 “opencv_highgui249.lib”,这个时候如果用到了宏链接模式,就需要修改代码:
比如:#pragma comment(lib , "opencv_highgui231.lib")
修改为:#pragma comment(lib , "opencv_highgui249.lib")
经过一段时间的琢磨,终于想到了一种比较好的方式,用于解决opencv多版本兼容,和大家分享一下,请大家批评指正。
代码如下:
// cv_libs.h: easy way to import opencv libs.
//
//
#ifndef _CV_LIBS_H_
#define _CV_LIBS_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <cv.h>
#define _CV_STR_EXP(__A) #__A
#define _CV_STR(__A) _CV_STR_EXP(__A)
#ifdef _DEBUG
#define _CV_VER CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)
#define _CV_LIB_SUF "d.lib"
#else
#define _CV_VER CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)
#define _CV_LIB_SUF ".lib"
#endif // _DEBUG
// opencv 1.x.x
#if(CV_MAJOR_VERSION < 2)
# pragma comment(lib , "cv" _CV_LIB_SUF)
# pragma comment(lib , "cvaux" _CV_LIB_SUF)
# pragma comment(lib , "cvhaartraining" _CV_LIB_SUF)
# pragma comment(lib , "cxcore" _CV_LIB_SUF)
# pragma comment(lib , "cxts" _CV_LIB_SUF)
# pragma comment(lib , "highgui" _CV_LIB_SUF)
# pragma comment(lib , "ml" _CV_LIB_SUF)
# ifdef CV_STLIB
# pragma comment(lib, "libjasper" _CV_LIB_SUF)
# pragma comment(lib, "libjpeg" _CV_LIB_SUF)
# pragma comment(lib, "libpng" _CV_LIB_SUF)
# pragma comment(lib, "libtiff" _CV_LIB_SUF)
# pragma comment(lib, "zlib" _CV_LIB_SUF)
# pragma comment(lib ,"comctl32.lib") //Windows
# pragma comment(lib ,"vfw32.lib") //Windows
# endif
#endif
// opencv 2.(0-2).x
#if(CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION < 3)
# pragma comment(lib , "cv" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "cxcore" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "highgui" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "cvaux" _CV_VER _CV_LIB_SUF)
// static lib
# ifdef CV_STLIB
# endif
#endif
// opencv 2.3.x lib
#if(CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION == 3)
# pragma comment(lib , "opencv_calib3d" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_contrib" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_core" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_features2d" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_flann" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_gpu" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_haartraining_engine" _CV_LIB_SUF)
# pragma comment(lib , "opencv_highgui" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_imgproc" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_legacy" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_ml" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_objdetect" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_ts" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_video" _CV_VER _CV_LIB_SUF)
// static lib
# ifdef CV_STLIB
# endif
#endif
// opencv 2.4.x lib
#if(CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION == 4)
# pragma comment(lib , "opencv_calib3d" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_contrib" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_core" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_features2d" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_flann" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_gpu" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_haartraining_engine" _CV_LIB_SUF)
# pragma comment(lib , "opencv_highgui" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_imgproc" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_legacy" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_ml" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_nonfree" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_objdetect" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_photo" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_stitching" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_ts" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_video" _CV_VER _CV_LIB_SUF)
# pragma comment(lib , "opencv_videostab" _CV_VER _CV_LIB_SUF)
// static lib
# ifdef CV_STLIB
# pragma comment(lib , "IlmImf" _CV_LIB_SUF)
# pragma comment(lib , "libjasper" _CV_LIB_SUF)
# pragma comment(lib , "libjpeg" _CV_LIB_SUF)
# pragma comment(lib , "libpng" _CV_LIB_SUF)
# pragma comment(lib , "libtiff" _CV_LIB_SUF)
# pragma comment(lib , "zlib" _CV_LIB_SUF)
# pragma comment(lib , "comctl32.lib") //Windows
# pragma comment(lib , "vfw32.lib") //Windows
# endif
#endif
#endif // _CV_LIBS_H_