【OpenCV版本问题】

OpenCV与cv_bridge冲突问题

1.问题介绍

笔者因为换了电脑,安装Ubuntu18.04时出现了很多系统问题,比如:亮度不能调整、没有声音、不能使用蓝牙、不能使用无线网…(笔者真的遭受了很多😂)。如果读者在安装Ubuntu18.04的过程中也遇到了类似的问题,可以和笔者讨论,这类问题多是驱动造成的。
鉴于Ubuntu18.04在笔者电脑上的诸多问题,笔者决定安装Ubuntu20.04。效果很nice,没有遇到太大的系统问题。之后便是安装Ros、Ceres等。


重申笔者的系统:Ubuntu20.04 + OpenCV4


接着安装vins-mono,安装向导里给出了代码用到的软件版本:
vins-mono软件配置

按照上述要求,安装OpenCV3.3.1,然后在项目的CMakeLists.txt中选择OpenCV版本(默认是使用ROS自带的OpenCV4.2.0),配置如下所示:

#设置自己安装的OpenCV的配置文件OpenCVConfig.cmake的路径
set(OpenCV_DIR "/usr/local/opencv3_3_1/share/OpenCV")
#对于OpenCV,find_package()是以Config模式工作的
find_package(OpenCV REQUIRED)
#打印出相关信息,方便查看
message(WARNING "OpenCV_DIR = ${OpenCV_DIR}")
message(WARNING "OpenCV_VERSION = ${OpenCV_VERSION}")

在所有用到OpenCV的CMakeLists.txt中都要添上上面类似的代码,接着编译运行。


2.出现问题

编译过程中遇到了下图所示的警告:
版本冲突
按理说,设置了OpenCV_DIR就能找到笔者安装的OpenCV3.3.1,那为什么编译时还会去找ROS自带的OpenCV呢?此外,终端里输出的编译信息也提示找的OpenCV是3.3.1版本:
编译输出
究竟是为啥呢?


3.发现错因

vins-mono项目中用到了cv_bridge功能包,这个功能包负责ROS类型的图像话题和OpenCV类型的图像进行转换。
比如ar_demo中就用到了cv_bridge,如下图所示:
ar_demo的CMakeLists.txt
问题就出在cv_bridge这个功能包上!

让我们来看下这个功能包的配置文件吧,打开/opt/ros/noetic/share/cv_bridge/cmake/cv_bridgeConfig.cmake文件。
可以看到cv_bridge的配置文件中,把寻找OpenCV头文件和库文件的路径写死了:
寻找头文件

寻找库文件怪不得即使我在项目的CMakeLists.txt中设定了OpenCV_DIR,cv_bridge仍然会找ROS自带的OpenCV。


4.解决问题

解决办法就是让cv_bridge找到你指定的OpenCV版本,这里直接给出笔者参考的一些博客(请读者尽量先浏览这些博客,找到适合自己情况的解决办法,然后再去做相应的修改)。
解决办法1
解决方法2

笔者是重新下载了melodic对应的cv_bridge功能包(下载到工作空间的src下),下载地址
安装完成之后,修改cv_bridge功能包下的CMakeLists.txt,主要是更改OpenCV配置文件的搜索路径,笔者的OpenCV配置文件在/usr/local/opencv_3_3_1/share/OpenCVOpenCV_DIR要修改成自己OpenCV配置文件的路径

cmake_minimum_required(VERSION 2.8)
project(cv_bridge)

find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)

set(OpenCV_DIR "/usr/local/opencv3_3_1/share/OpenCV")
if(NOT ANDROID)
  find_package(PythonLibs)
  #if(PYTHONLIBS_VERSION_STRING VERSION_LESS 3)
    find_package(Boost REQUIRED python)
  #else()
    #find_package(Boost REQUIRED python3)
  #endif()
else()
find_package(Boost REQUIRED)
endif()
find_package(OpenCV 3.3.1 REQUIRED
  COMPONENTS
    opencv_core
    opencv_imgproc
    opencv_imgcodecs
  CONFIG
)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES ${PROJECT_NAME}
  CATKIN_DEPENDS rosconsole sensor_msgs
  DEPENDS OpenCV
  CFG_EXTRAS cv_bridge-extras.cmake
)

catkin_python_setup()

include_directories(include ${Boost_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})

if(NOT ANDROID)
add_subdirectory(python)
endif()
add_subdirectory(src)
if(CATKIN_ENABLE_TESTING)
  add_subdirectory(test)
endif()

# install the include folder
install(
  DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)

接着就是编译了,读者可以参考这个链接安装
如果读者在安装过程中出现了找不到boost_python3,参考这个回答boost_python3问题。将CMakeLists.txt中的以下部分注释掉即可,如下图所示:
CMakeLists.txt修改
重新编译即可。
编译完成之后,我们来看下cv_bridge的配置文件cv_bridgeConfig.cmake的内容:
在这里插入图片描述


继续使用

因为需要指定cv_bridge,所以得在项目的CMakeLists.txt中设置cv_bridge_DIR
CMakeLists.txt
这样,在编译vins-mono的时候就不会出现错误了,笔者在完成上述操作后编译非常的顺利。


总结

  1. 如果你的Ubuntu是20.04(ROS自带OpenCV4),但项目中要用到OpenCV3cv_bridge,本博客可能很适合你。
  2. 如果你的Ubuntu是20.04(ROS自带OpenCV4),项目中要用到OpenCV4cv_bridge,那就不用setcv_bridge_DIR了,也不用完成本博客中的操作了,因为不会出现opencv和cv_bridge版本冲突的问题。
  3. 如果你的Ubuntu是16.04(ROS自带OpenCV3),但项目中要用到OpenCV4cv_bridge,本博客也适合你。
  4. 如果你的Ubuntu是16.04(ROS自带OpenCV3),项目中要用到OpenCV3cv_bridge,也不会出现版本冲突的问题。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值