OpenCV与cv_bridge冲突问题
1.问题介绍
笔者因为换了电脑,安装Ubuntu18.04时出现了很多系统问题,比如:亮度不能调整、没有声音、不能使用蓝牙、不能使用无线网…(笔者真的遭受了很多😂)。如果读者在安装Ubuntu18.04的过程中也遇到了类似的问题,可以和笔者讨论,这类问题多是驱动造成的。
鉴于Ubuntu18.04在笔者电脑上的诸多问题,笔者决定安装Ubuntu20.04。效果很nice,没有遇到太大的系统问题。之后便是安装Ros、Ceres等。
重申笔者的系统:Ubuntu20.04 + OpenCV4
接着安装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
,如下图所示:
问题就出在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/OpenCV
,OpenCV_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
中的以下部分注释掉即可,如下图所示:
重新编译即可。
编译完成之后,我们来看下cv_bridge的配置文件cv_bridgeConfig.cmake
的内容:
继续使用
因为需要指定cv_bridge
,所以得在项目的CMakeLists.txt
中设置cv_bridge_DIR
。
这样,在编译vins-mono的时候就不会出现错误了,笔者在完成上述操作后编译非常的顺利。
总结
- 如果你的Ubuntu是20.04(ROS自带OpenCV4),但项目中要用到
OpenCV3
和cv_bridge
,本博客可能很适合你。 - 如果你的Ubuntu是20.04(ROS自带OpenCV4),项目中要用到
OpenCV4
和cv_bridge
,那就不用setcv_bridge_DIR
了,也不用完成本博客中的操作了,因为不会出现opencv和cv_bridge版本冲突的问题。 - 如果你的Ubuntu是16.04(ROS自带OpenCV3),但项目中要用到
OpenCV4
和cv_bridge
,本博客也适合你。 - 如果你的Ubuntu是16.04(ROS自带OpenCV3),项目中要用到
OpenCV3
和cv_bridge
,也不会出现版本冲突的问题。