最近重新开始使用opencv-cpp,有些项目需要的是OpenCV2,有些需要多是OpenCV3,这两个版本的如何共存是个值得研究多问题。这里记录一次OpenCV3和2的安装过程。
安装OpenCV3
1.源码下载
我这里使用的是OpenCV3.4.1,再github可以下载其源代码:https://github.com/opencv/opencv/tags?after=4.0.0-beta。
2.依赖安装
我使用的是opencv3.4.1,需要安装以下依赖.
sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
3.编译安装
解压下载的opencv源代码包,并在终端进入该目录,然后新建build文件夹。
(base) chenjianqu@chen:~/software/opencv-3.4.1$ mkdir build (base) chenjianqu@chen:~/software/opencv-3.4.1$ cd build
接着就可以直接编译安装了。
cmake -D BUILD_TIFF=ON -D ENABLE_PRECOMPILED_HEADERS=OFF .. make -j8 #开启8个线程 sudo make install
让系统能找到opencv库路径
sudo gedit /etc/ld.so.conf.d/opencv.conf # 末尾添加/usr/local/lib sudo ldconfig # 使得上面的配置路径生效
配置bash
sudo gedit /etc/bash.bashrc
#末尾添加下面两行
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
source /etc/bash.bashrc # 保存,执行如下命令使得配置生效 sudo updatedb # 更新
4.测试
使用KDevelop4测试OpenCV的效果。
CMakeLists.txt
cmake_minimum_required(VERSION 2.6) project(imagebinoculartest) # 添加c++ 11标准支持 set( CMAKE_CXX_FLAGS "-std=c++11" ) find_package( OpenCV 3 REQUIRED ) include_directories( ${OpenCV_INCLUDE_DIRS} ) add_executable(imagebinoculartest main.cpp) target_link_libraries(imagebinoculartest ${OpenCV_LIBS}) install(TARGETS imagebinoculartest RUNTIME DESTINATION bin)
main.cpp
#include <iostream> #include <chrono> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace std; using namespace cv; int main ( int argc, char** argv ) { cout << "OpenCV version : " << CV_VERSION << endl; Mat leftImg=imread("left.png",0); Mat rightImg=imread("right.png",0); imshow ( "leftImg", leftImg); imshow ( "rightImg", rightImg); waitKey ( 0 ); destroyAllWindows(); return 0; }
安装OpenCV2
1.源码下载
我这里使用的是OpenCV2.4.8,再github可以下载其源代码:https://github.com/opencv/opencv/tags?after=3.0.0-alpha。
2.依赖安装
需要安装以下依赖.
sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev
3.编译安装
跟OpenCV3一样,解压源代码,新建build目录,在build目录下编译安装。设置安装目录为/usr/local/opencv248。
sudo mkdir -p /usr/local/opencv248 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv248 -D WITH_CUDA=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF..
因为我这里安装了CUDA9.0,不支持OpenCV2.4,因此我这里把CUDA编译选项关掉了。然而CMake的时候,还是报错了:
报错1:
CMake Error at cmake/OpenCVDetectCXXCompiler.cmake:85 (list): list GET given empty list Call Stack (most recent call first): CMakeLists.txt:77 (include)
解决办法:参照https://blog.csdn.net/u010003609/article/details/100086911
接下来进行make:
make -j4
进行到92%的时候,又出错了。
报错2:
[ 92%] Building CXX object modules/contrib/CMakeFiles/opencv_contrib.dir/src/retinacolor.cpp.o /home/chen/lib/opencv-2.4.8.3/modules/contrib/src/chamfermatching.cpp: In member function ‘void cv::ChamferMatcher::Matching::computeDistanceTransform(cv::Mat&, cv::Mat&, cv::Mat&, float, float, float)’: /home/chen/lib/opencv-2.4.8.3/modules/contrib/src/chamfermatching.cpp:969:30: error: the compiler can assume that the address of ‘annotate_img’ will never be NULL [-Werror=address] if (&annotate_img!=NULL) { ^ /home/chen/lib/opencv-2.4.8.3/modules/contrib/src/chamfermatching.cpp:1016:34: error: the compiler can assume that the address of ‘annotate_img’ will never be NULL [-Werror=address] if (&annotate_img!=NULL) { ^ /home/chen/lib/opencv-2.4.8.3/modules/contrib/src/chamfermatching.cpp: In member function ‘cv::ChamferMatcher::Match* cv::ChamferMatcher::Matching::localChamferDistance(cv::Point, cv::Mat&, cv::Mat&, cv::ChamferMatcher::Template*, float)’: /home/chen/lib/opencv-2.4.8.3/modules/contrib/src/chamfermatching.cpp:1111:25: error: the compiler can assume that the address of ‘orientation_img’ will never be NULL [-Werror=address]
解决办法:参照https://blog.csdn.net/Qin605/article/details/86621313
4.测试
此时已经安装了两个版本的OpenCV,但是系统默认的是OpenCV3,可以通过如下命令查看OpenCV的版本:
pkg-config --modversion opencv
可以通过再~/.bashrc里设置环境变量来更改默认的OpenCV为OpenCV2:
sudo gedit ~/.bashrc
在该文件末尾添加路径:
export PKG_CONFIG_PATH=/usr/local/opencv249/lib/pkgconfig export LD_LIBRARY_PATH=/usr/local/opencv249/lib
然后更新bash:
sudo source ~/.bashrc
此时再使用pkg-config --modversion opencv来查看版本就能发现已经更改为OpenCV2.4.8了。
这里使用程序进行测试。程序和上面的OpenCV3一样,但是CMakeLists.txt需要进行配置:
CMakeLists.txt
cmake_minimum_required(VERSION 2.6) project(imagebinoculartest) set( CMAKE_CXX_FLAGS "-std=c++11" ) set(OpenCV_DIR /usr/local/opencv248/share/OpenCV) find_package(OpenCV 2.4 REQUIRED) include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS} /usr/local/opencv248/include) add_executable(imagebinoculartest main.cpp) target_link_libraries(imagebinoculartest ${OpenCV_LIBS}) install(TARGETS imagebinoculartest RUNTIME DESTINATION bin)
这样就能使用OpenCV2了。
参考文献
[0]ykwjt.ubuntu16.04上的OpenCV多版本共存.2019-05-15