Ubuntu18.04中cv_bridge如何调用不同版本的opencv库

目录


一、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.cmakeopencv-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_PATHCMAKE_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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容