目录
一、cv_bridge和opencv的关系
1.1 cv_bridge库利用Linux的opencv库函数的API,其类名称是cv_bridge;而opencv包是真正实现图像处理的库函数,用的类名称是cv。
1.2 cv_bridge可以实现opencv类型的图像与ROS的消息类型sensor_msgs/Image相互转换
https://blog.csdn.net/wangbaodong070411209/article/details/112397588
1.3 cv_bridge是一个ros的package。在使用该包时,其会自动寻找系统自带的opencv。该包本身不包含opencv的实现代码,是通过调用系统自带的opencv来对图像进行处理,相当于对opencv进行了封装。
二、cv_bridge调用不同版本的opencv的方法(假设系统中有多个版本的opencv)
2.1 不使用cv_bridge
如果ROS代码中不涉及到将图像转换为ROS的消息类型,可以不使用cv_bridge这个包,直接使用OpenCV,通过在CMakeLists.txt中添加OpenCV包依赖,在主函数中直接调用OpenCV的API。
优点:简单粗暴,见效快
缺点:无法将图像数据转换为ROS的消息类型
https://blog.csdn.net/chengde6896383/article/details/105765854
https://blog.csdn.net/bigdog_1027/article/details/79092263
2.2 直接修改ROS的cv_bridge.cmake配置文件
优点:简单粗暴,见效快
缺点:重定向了cv_bridge调用的opencv版本,会影响到系统中的其它使用cv_bridge API的ROS程序,若其它ROS程序使用opencv版本不是该版本,则又会报错!
https://blog.csdn.net/bigdog_1027/article/details/79092263
2.3 重新编译(推荐)
下载cv_bridge源码到ROS工作空间中(catkin_ws/src/cv_bridge/),在cv_bridge源码的CMakeList.txt中修改find_package函数中opencv库的路径位置后,手动编译,供该ROS工作空间下的其它包调用(其它ROS包在调用cv_bridge时会优先找本地包,本地包找不到再去系统环境下找!)
优点:稳定,迁移性好,不破坏系统环境
缺点:配置麻烦
原始cv_bridge源码的CMakeList.txt寻找opencv库如下
find_package(OpenCV 4 QUIET
COMPONENTS
opencv_core
opencv_imgproc
opencv_imgcodecs
CONFIG
)
修改后
set(OpenCV_DIR /usr/local/opencv3.2/share/Opencv)
find_package(Opencv 3.2.0 EXAT
COMPONENTS
opencv_core
opencv_imgproc
opencv_imgcodecs
CONFIG
)
注意1:不要修改cv_bridge的CMakeList.txt文件的工程名为cv_bridge_1,因为编译的时候会先找工作空间下的包,否则迁移会很麻烦。
注意2:该方法是修改cv_bridge源码的CMakeList.txt文件,在编译cv_bridge的过程中,编译完成后,在cv_bridge.cmake(编译后生成的文件)中可以看到编译后的cv_bridge调用的opencv版本。
该小节内容参考:
https://blog.csdn.net/qq_30460905/article/details/116901596
https://blog.csdn.net/qinqinxiansheng/article/details/120219388
三、CMake命令解释
3.1 set命令
set(OpenCV_DIR /usr/local/opencv3.2/share/Opencv)这一行设置一个 CMake 变量 OpenCV_DIR,用于指定 OpenCV 配置文件(OpenCVConfig.cmake)的路径。这里,它被设置为 /usr/local/opencv3.2/share/OpenCV。这个变量将用于 find_package 命令,以便找到正确的 OpenCV 安装。
3.2 find_package命令
find_package命令用于在项目中查找和导入指定的库。CMake会查找名为OpenCVConfig.cmake或opencv-config.cmake的文件来确定库的位置。
在这个例子中,它查找OpenCV库,并要求找到的版本与3.2.0完全匹配(EXACT参数)。
COMPONENTS参数后面列出了需要的OpenCV模块,这里包括:
-
opencv_core:OpenCV核心模块,包含基本数据结构和函数。 -
opencv_imgproc:图像处理模块,包含各种图像处理函数,如滤波、直方图均衡化等。 -
opencv_imgcodecs:图像文件读取和写入模块,支持多种图像格式。
CONFIG参数表示使用OpenCV的配置模式查找库,这通常意味着使用一个名为OpenCVConfig.cmake的脚本来查找和导入库。这种方法通常更准确,因为它是由库的开发者提供的。
3.3 find_package查找库的顺序
在使用find_package命令查找库时,CMake遵循以下顺序进行搜索:
1.如果设置了<PackageName>_DIR变量(在本例中为OpenCV_DIR),CMake会先查找该变量所指定的路径。
2.接下来,CMake会检查CMAKE_PREFIX_PATH变量中指定的路径。
3.接着,CMake会检查CMAKE_MODULE_PATH变量中指定的路径。
4.最后,CMake会检查预定义的系统路径。
所以,在设置了OpenCV_DIR参数的情况下,CMake会先查找OpenCV_DIR所指定的路径,然后再查找CMAKE_PREFIX_PATH和CMAKE_MODULE_PATH变量所指定的路径。
所以,在这个例子中,即使find_package命令中没有显式使用OpenCV_DIR变量,CMake在执行find_package命令时仍会根据OpenCV_DIR变量的值来查找OpenCV库。如果没有设置OpenCV_DIR变量,CMake可能无法找到正确的OpenCV库。
如果不设置 OpenCV_DIR变量,find_package 命令将尝试在默认的系统路径下查找 OpenCV安装。在某些情况下,如果系统安装了多个版本的 OpenCV 或者安装在非标准路径下,那么不设置 OpenCV_DIR 变量可能会导致找到错误的版本或者找不到 OpenCV。设置 OpenCV_DIR 变量有助于确保查找到正确的 OpenCV 安装。
3.4 库名称大小写
在CMake中,find_package命令对大小写不敏感。然而,为了保持一致性,通常建议使用库名称的正确大小写。在OpenCV的情况下,官方文档中推荐的大小写是find_package(OpenCV ...),其中“OpenCV”是大写的“O”和“CV”以及小写的“pen”。
然而,在实际使用中,即使你输入find_package(OpenCV ...),find_package(opencv ...)或find_package(OPENCV ...),CMake仍然可以正确找到OpenCV库。尽管如此,为了避免混淆和保持可读性,建议遵循官方文档中的命名规范。
参考阅读顺序
1.https://blog.csdn.net/bigdog_1027/article/details/79092263
2.https://blog.csdn.net/qinqinxiansheng/article/details/120219388(其中的2、3部分)
3.https://blog.csdn.net/qinqinxiansheng/article/details/120219388