多个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/lib/libo

最低0.47元/天 解锁文章
1497

被折叠的 条评论
为什么被折叠?



