ubuntu18.04中多版本OpenCV切换的尝试

前言

在日常使用时可能会需要不同版本的OpenCV,因此在ubuntu18.04系统上如何安装多个版本的OpenCV很有必要。成功的关键是安装到不同的路径,并在CMakeList.txt中找到需要的版本。

多版本OpenCV共存

假设我们已经安装好一版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

说明

  1. 其中/usr/local/opencv/opencv-3.4.6为安装OpenCV3.4.6的路径,这个十分关键。
  2. 设置OFF的理由如下,可大大加快编译速度,当然还要根据需求进行设置。
  3. It is useful also to unset BUILD_EXAMPLES, BUILD_TESTS, BUILD_PERF_TESTS - as they all will be statically linked with OpenCV and can take a lot of memory.
  4. 此外,还可以取消设置BUILD_EXAMPLES,BUILD_TESTS和BUILD_PERF_TESTS,因为它们都将与OpenCV静态链接,并且会占用大量内存。
  5. 编译时可能需要下载的文件处理,请在在缓存文件夹下查看 ~/opencv-3.4.6/opencv/.cache
    缺少的文件可以在这里下载。
    https://github.com/opencv/opencv_3rdparty/branches
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)

设置添加OpenCV动态库信息

(1)方法1

$sudo sh -c 'echo "/usr/local/opencv/opencv-3.4.6/lib" > /etc/ld.so.conf.d/opencv.conf'

(2)方法2

$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

指定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

添加python接口

这里建立软链接

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版本

这里以opencv-3.4.6和opencv-4.2.0之间的切换为例子。
两个版本分别安装在
/usr/local/opencv/opencv-3.4.6/

/usr/local/opencv/opencv-4.2.0/

1. 三步修改

(1)第1步

$sudo gedit /etc/ld.so.conf.d/opencv.conf

在文件末尾修改为

/usr/local/opencv/opencv-4.2.0/lib

(2)第2步

$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

(3)第3步

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

2. 版本查看

2.1 opencv版本查看

$pkg-config --modversion opencv  
$pkg-config --cflags opencv  
$pkg-config --libs opencv

2.2 python接口查看

(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

你可能感兴趣的:(VSLAM,环境配置,自动驾驶)