ROS节点中OpenCV 4与cv_bridge版本冲突问题如何解决?
ROS环境下OpenCV版本与cv_bridge冲突修复方案
问题根因
ROS Melodic(对应Ubuntu 18.04)官方源中的cv_bridge默认绑定系统预装的OpenCV 3.2版本,你自行编译安装的OpenCV 4与cv_bridge依赖的版本存在符号冲突,导致运行时功能异常、节点崩溃。
可行修复方案
方案1:基于OpenCV 3.2编译对应版本opencv_contrib(最稳妥,推荐优先使用)
- 首先卸载已安装的OpenCV 4,避免多版本干扰:进入你之前编译OpenCV 4的build目录,执行
sudo make uninstall,再删除相关残留文件即可。 - 下载与系统OpenCV版本完全匹配的opencv_contrib源码:你系统OpenCV版本为3.2.0,直接下载对应3.2.0标签的opencv_contrib源码包即可。
- 重新编译OpenCV 3.2,编译配置中添加
OPENCV_EXTRA_MODULES_PATH参数指向你下载的opencv_contrib的modules目录,完成安装。 - 修改你项目的CMakeLists.txt,将
find_package(OpenCV 4 REQUIRED)改为find_package(OpenCV 3 REQUIRED),重新执行catkin_make即可。
该方案无需修改ROS基础组件,适配性最好,xfeatures2d模块可正常使用。
方案2:重新编译cv_bridge绑定OpenCV 4(适合必须使用OpenCV 4特性的场景)
你完全可以修改cv_bridge绑定的OpenCV版本,操作流程如下:
- 将cv_bridge对应版本的源码克隆到你当前ROS工作空间的src目录下,Melodic版本选择melodic-devel分支即可。
- 打开cv_bridge包的CMakeLists.txt,将其中的
find_package(OpenCV REQUIRED)修改为find_package(OpenCV 4 REQUIRED)。 - 回到工作空间根目录,执行
catkin_make --force-cmake,编译过程会优先使用你工作空间内修改过的cv_bridge,自动绑定你安装的OpenCV 4,与你自己的项目版本一致,不会出现冲突。
注意:该修改仅对你当前工作空间生效,不会影响系统全局的cv_bridge配置。
方案3:临时调整链接顺序(不推荐,仅作临时验证用)
你可以修改CMakeLists.txt中target_link_libraries的顺序,将OpenCV库放在catkin库前面,强制链接器优先使用OpenCV 4的库:
target_link_libraries(visual_Odometry ${OpenCV_LIBRARIES} ${catkin_LIBRARIES})
该方案属于临时规避手段,部分场景下仍可能出现符号冲突导致崩溃,不建议长期使用。
常见疑问解答
- 是否可以基于OpenCV3.2编译opencv_contrib?
完全可以,只要保证opencv_contrib的版本号与你使用的OpenCV版本号完全一致,即可正常编译使用,不存在兼容性问题。 - 是否可以修改cv_bridge绑定的OpenCV版本?
完全可以,通过源码编译cv_bridge并指定对应OpenCV版本即可,支持全局修改或者仅当前工作空间生效。
内容的提问来源于stack exchange,提问作者Daniele Caradonna
相关产品推荐
相关产品推荐

