在日常使用时可能会需要不同版本的OpenCV,因此在ubuntu18.04系统上如何安装多个版本的OpenCV很有必要。成功的关键是安装到不同的路径,并在CMakeList.txt中找到需要的版本。
假设我们已经安装好一版OpenCV,一般都安装在/usr/local下。
如果需要安装另一个版本的OpenCV,就不能再安装到/usr/local,而是选择其他路径,否则会覆盖掉之前的版本。
一般可以按照这样的结构:
/usr/local/opencv-3.1.0, /usr/local/opencv-3.4.6
或者把所有的OpenCV全部安装在了/usr/local/opencv目录下。
STEP-1,下载OpenCV
STEP-2,安装依赖包
STEP-3,编译安装OpenCV
详见官方文档https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html。
本次opencv-3.4.6安装的源码目录为:~/opencv-3.4.6/build/installed,用于编译和安装opencv-3.4.6。
安装路径为:/usr/local/opencv/opencv-3.4.6
对应的设置项目为:
-DCMAKE_INSTALL_PREFIX=~/usr/local/opencv/opencv-3.4.6 \
第三方模块
文件路径设置:
-DOPENCV_EXTRA_MODULES_PATH=~/downloads/opencv3.4.6/opencv_contrib-3.4.6/modules \
$ cd opencv-3.4.6
$ mkdir build
$ cd build
$ mkdir installed
$ cmake \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local/opencv/opencv-3.4.6 \
-DOPENCV_EXTRA_MODULES_PATH=~/downloads/opencv3.4.6/opencv_contrib-3.4.6/modules \
\
\
-DWITH_CUDA=OFF \
\
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
..
$ make -j4
$ sudo make install
说明
tree
├── data
│ └── 7505c44ca4eb54b4ab1e4777cb96ac05-face_landmark_model.dat
├── ippicv
│ └── c0bd78adb4156bbf552c1dfe90599607-ippicv_2019_lnx_intel64_general_20180723.tgz
└── xfeatures2d
├── boostdesc
│ ├── 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
│ ├── 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
│ ├── 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
│ ├── 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
│ ├── 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
│ ├── 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
│ └── e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
└── vgg
├── 151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
├── 7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
├── 7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
└── e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i
需要编辑 .cache 目录下对应的cmake文件
/opencv_contrib/modules/xfeatures2d/*.cmake
/opencv_contrib/modules/face/CMakeLists.txt
/opencv/3rdparty/ffmpeg/ffmpeg.cmake
/opencv/3rdparty/ippicv/ippicv.cmake
使用 "file:~/Downloads/opencv-3.4.6/loadfiles/"替换
或者,直接复制文件到.cache对应的目录下,并覆盖对应的文件。
STEP-4,多版本OpenCV切换
打开~/.bashrc
$ gedit ~/.bashrc
在文件末尾增加以下内容
export PKG_CONFIG_PATH = /usr/local/opencv/opencv-3.4.6/lib/pkgconfig
export LD_LIBRARY_PATH = /usr/local/opencv/opencv-3.4.6/lib
更新~/.bashrc
$ source ~/.bashrc
查询OpenCV版本
$ pkg-config --modversion opencv
如果输出3.4.6,就表明配置成功。
如果想使用之前的版本,在~/.bashrc中注释掉增加的内容,然后source ~/.bashrc即可。
如果只有一个版本的OpenCV,在CMakeList.txt中使用以下语句即可。
FIND_PACKAGE(OpenCV REQUIRED)
在OpenCV编译好后,所在目录中会生成OpenCVConfig.cmake文件,这个文件中指定了CMake要去哪里找OpenCV,其.h文件在哪里等。
如果存在多版本OpenCV时,需要找到所需版本对应的OpenCVConfig.cmake文件,并将其路径添加到工程的CMakeLists.txt中。
示例如下:
cmake_minimum_required(VERSION 2.8)
set(OpenCV_DIR "/usr/local/opencv/opencv-3.4.6")
project(test)
find_package(OpenCV REQUIRED)
include_directories(~/usr/local/opencv-3.4.6/include)
$sudo sh -c 'echo "/usr/local/opencv/opencv-3.4.6/lib" > /etc/ld.so.conf.d/opencv.conf'
$sudo gedit /etc/ld.so.conf.d/opencv.conf
在文件末尾添加
/usr/local/opencv/opencv-3.4.6/lib
然后
sudo ldconfig
sudo apt-get update
如果成功的话,正确的结果将会发现前面动态库的名字
$ sudo ldconfig -v > temp.so.txt && cat temp.so.txt|grep opencv
$sudo gedit /etc/profile
$sudo gedit ~/.profile
在文件末尾添加
export PKG_CONFIG_PATH = /usr/local/opencv/opencv-3.4.6/lib/pkgconfig
export LD_LIBRARY_PATH = /usr/local/opencv/opencv-3.4.6/lib
这里建立软链接
sudo ln -s /usr/local/opencv/opencv-3.4.6/lib/python2.7/dist-packages/cv2.so /usr/local/lib/python2.7/dist-packages
sudo ln -s /usr/local/opencv/opencv-3.4.6/lib/python3.6/dist-packages/cv2.cpython-36m-x86_64-linux-gnu.so /usr/local/lib/python3.6/dist-packages
这里以opencv-3.4.6和opencv-4.2.0之间的切换为例子。
两个版本分别安装在
/usr/local/opencv/opencv-3.4.6/
和
/usr/local/opencv/opencv-4.2.0/
$sudo gedit /etc/ld.so.conf.d/opencv.conf
在文件末尾修改为
/usr/local/opencv/opencv-4.2.0/lib
$sudo gedit /etc/profile
$sudo gedit ~./bashrc
# include folder
#export PATH=$PATH:/usr/local/opencv-3.1.0/
#export PATH=$PATH:/usr/local/opencv-3.1.0/include
#export PATH=$PATH:/usr/local/opencv-3.1.0/include/opencv2
#export INCLUDE_PATH = /usr/local/opencv-3.1.0/include
# 指定opencv头文件位置
#export PKG_CONFIG_PATH=/usr/local/opencv-3.1.0/lib/pkgconfig
#export LD_LIBRARY_PATH=/usr/local/opencv-3.1.0/lib*
修改为
export PKG_CONFIG_PATH = /usr/local/opencv/opencv-4.2.0/lib/pkgconfig
export LD_LIBRARY_PATH = /usr/local/opencv/opencv-4.2.0/lib
保存之后
$ sudo ldconfig
$ sudo source /etc/profile
a.先删除软链接(如果以及配置)
注意:opencv-3.4.6同时包含python2和python3接口。
cd /usr/local/lib/python2.7/dist-packages
sudo rm cv2.so
cd /usr/local/lib/python3.6/dist-packages
sudo rm cv2.so
如果使用删除软链接的方法,多敲一个/就能够引起灾难性后果——整个目录都没了。
b.重新建立软链接 (貌似不会起作用)
sudo ln -s /usr/local/opencv/opencv-4.2.0/lib/python2.7/dist-packages/cv2.so /usr/local/lib/python2.7/dist-packages
sudo ln -s /usr/local/opencv/opencv-4.2.0/lib/python3.6/dist-packages/cv2.so /usr/local/lib/python3.6/dist-packages
$pkg-config --modversion opencv
$pkg-config --cflags opencv
$pkg-config --libs opencv
(1)opencv-3.4.6之后
python2(或python3)
from cv2 import __version__
print(__version__)
输出3.4.6
(2)opencv4.2.0之后
当环境切换为opencv4.2.0时,执行
python2(或python3)
from cv2 import __version__
print(__version__)
输出4.2.0
第三方工作包(模块下载)
https://github.com/opencv/opencv_contrib/releases
编译时缺少的文件需要在这里下载。
https://github.com/opencv/opencv_3rdparty/branches