今天调试了一天的opencv,学会了OpenCV多版本共存的问题,分享一下经验
由于项目中用到了OpenCV3.1版本,而电脑上有很早就装好的opencv2.4.9版本(直接装在/usr/下),和一个opencv4.0.0(装在/usr/local/下,不知道什么时候装的。。),还有一个ros中自带的opencv3.3.1(在ros工程目录下)。
一直不知道这些版本是如何和平共处到现在的。。
第一步,卸载,把原先的几个版本都删了(ros中的那个没删,不敢动)
删除参考的是这个博客:
https://blog.csdn.net/qiaoji6073/article/details/76572801
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*
第二步,下载对应版本并编译
在编译之前先想好安装在什么地方,例如我想装opencv3.1.0,我就直接把整个文件都安装在/usr/local/opencv310里(之前一直不想改安装路径,直到多版本出现问题了才发现单独开一个目录的好处)。
在CMAKE的时候添加:
cmake -DCMAKE_BUILD_TYPE=Debug -CMAKE_INSTALL_PREFIX=/usr/local/opencv310
然后make一下,在sudo make install一下。然后查看一下/usr/local/opencv310/里面的东西,就明白第一步为什么删那些东西了。
安装到这里就可以结束了,我看别的教程里还要求把配置文件和lib库目录放到系统变量 PKG_CONFIG_PATH和LD_LIBRARY_PATH当中,例如:
https://blog.csdn.net/learning_tortosie/article/details/80594399
其实不用添加也行,添加了我感觉反而会乱。
第三步,编译工程项目
之前说过我要编译的工程里要调用opencv3.1.0,那么在就需要在cmakelist.txt中加入
find_package(OpenCV 3.1 REQUIRED)
这句话如果执行成功会自动为编译缓存中添加OPENCV_INCLUDE_DIRS和OPENCV_LIBRARIES这两个变量,分布代表了opencv的头文件目录和库目录。
如果报错找不到opencv(很大概率找不到,应为根本没安装在默认位置),有两种等效的解决方案。
第一种,手动添加变量:
把find_package(OpenCV 3.1 REQUIRED)注释掉,然后加入:
set(OpenCV_INCLUDE_DIRS /usr/local/opencv310/include;/usr/local/opencv310/include/opencv)
set(OpenCV_LIBRARIES opencv_highgui;opencv_dnn;opencv_imgproc;opencv_superres;opencv_videostab;opencv_video;opencv_viz;opencv_ml;opencv_objdetect;opencv_shape;opencv_stitching;opencv_photo;opencv_imgcodecs;opencv_videoio;opencv_calib3d;opencv_flann;opencv_features2d;opencv_core
)
第二种,手动添加opencv.cmake目录
在执行cmake的时候,添加
-DOPENCV_DIR /usr/local/opencv310/share/OpenCV
就可以了。
不同版本直接切换只需更改相应的安装目录即可。