多个ROS包使用不同Opencv版本冲突解决

多个ROS包使用不同Opencv版本冲突一般发生在opencv3和opencv4之间,一劳永逸的解决就是修改代码将3升级到4。

本文提供的方式是不修改代码,隔离opencv环境,使多个opencv版本共存,且被不同ros包编译使用时隔离。

1 源码编译opencv且install到本地。

mkdir -p /home/lucky/Lib/opencv3.4
mv opencv_contrib-3.4.5.tar.gz /home/lucky/Lib/opencv3.4
mv opencv-3.4.5.tar.gz /home/lucky/Lib/opencv3.4
cd /home/lucky/Lib/opencv3.4
tar -xvf opencv_contrib-3.4.5.tar.gz 
tar -xvf opencv-3.4.5.tar.gz 
mv opencv-3.4.5 opencv
mv opencv_contrib-3.4.5 opencv_contrib
cd opencv
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=../../opencv/install -D CMAKE_BUILD_TYPE=RELEASE  -D WITH_OPENGL=ON  -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
make -j8
make install

注意:CMAKE_INSTALL_PREFIX=../../opencv/install 已经被指定为/home/lucky/opencv3.4/opencv/install目录。因此make install不会安装到系统/usr 目录中,也不需要sudo

2 cv_bridge带来的冲突

我们通常apt安装ros时,会安装了ros-noetic-cv-bridge,这个包被rviz等使用。注意ros-noetic-cv-bridge通常会依赖系统提供的libopencv-dev==4.2,以ubuntu20为例,系统会有一套依赖库:

ros-noetic-desktop -> ros-noetic-cv-bridge -> opencv4.2

假如你的ros包依赖cv-bridge同时依赖opencv3.4,如果你使用ros提供的ros-noetic-cv-bridge(opencv4.2)和自己编译的opencv3.4,那么程序中会有两种libopencv,程序运行时会崩溃,有时候不崩溃但是程序卡住或者数据出错。

例如:

lucky@lucky:~/ws_vins/devel/lib$ ldd feature_tracker/feature_tracker | grep libopencv_core
        libopencv_core.so.4.2 => /home/lucky/Lib/opencv4.2/opencv/install/li

你可能感兴趣的:(ROS,opencv,人工智能,计算机视觉)