如何使用ROS自带OpenCV进行编译

系统:Ubuntu16.04

ROS:Kinetic

一般来说,安装ROS的过程中会自动安装OpenCV库,如果通过sudo apt-get install libopencv-dev安装opencv的话,就会存在两个版本的opencv,且两个OpenCV安装的路径也不同,在编译程序过程中,有时找不到某个版本的opencv,有时又需要依赖特定版本的opencv,故在这里记录使用特定版本opencv编译代码的方法。

1.CMakeLists.txt情况下

CMakeLists.txt中常通过find_package命令来寻找opencv,如果想指定某个版本的opencv,需要找到对应的OpenCVConfig.cmake文件,事实上这个做法也适用于找所有特定版本的库,对于ROS自带的OpenCV,可以通过添加如下代码索引

set(OpenCV_DIR /opt/ros/kinetic/share/OpenCV-3.3.1-dev/)

 2.Makefile情况下

有些时候cmake版本太低编译不了某些库,只能用makefile编译,这时候makefile通常会通过pkg-config这个工具来在电脑里搜寻,ROS自带的OpenCV无法被找到,原因是pkg-config这个工具会搜寻一些路径下的.pc文件来定位库的位置,对于opencv来说,这个文件就是opencv.pc。如果你是用apt-get安装的opencv,应该可以直接被pkg-config找到,而如果你想用ROS自带的opencv,就得自己添加这个文件。

通过如下几条指令新建一个opencv.pc(主要是要在usr/local/lib这个文件夹下,pkgconfig文件夹建立随意):

cd /usr/local/lib/
mkdir pkgconfig
cd pkgconfig
sudo touch opencv.pc
sudo gedit opencv.pc

在这个文档里键入以下内容:

# Package Information for pkg-config

prefix=/opt/ros/kinetic
exec_prefix=${prefix}
libdir=${exec_prefix}/lib/x86_64-linux-gnu
includedir_old=${prefix}/include/opencv-3.3.1-dev/opencv
includedir_new=${prefix}/include/opencv-3.3.1-dev

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.3.1
Libs: -L${exec_prefix}/lib/x86_64-linux-gnu -lopencv_stitching3 -lopencv_superres3 -lopencv_videostab3 -lopencv_aruco3 -lopencv_bgsegm3 -lopencv_bioinspired3 -lopencv_ccalib3 -lopencv_cvv3 -lopencv_dpm3 -lopencv_face3 -lopencv_photo3 -lopencv_fuzzy3 -lopencv_hdf3 -lopencv_img_hash3 -lopencv_line_descriptor3 -lopencv_optflow3 -lopencv_reg3 -lopencv_rgbd3 -lopencv_saliency3 -lopencv_stereo3 -lopencv_structured_light3 -lopencv_viz3 -lopencv_phase_unwrapping3 -lopencv_surface_matching3 -lopencv_tracking3 -lopencv_datasets3 -lopencv_text3 -lopencv_dnn3 -lopencv_plot3 -lopencv_xfeatures2d3 -lopencv_shape3 -lopencv_video3 -lopencv_ml3 -lopencv_ximgproc3 -lopencv_calib3d3 -lopencv_features2d3 -lopencv_highgui3 -lopencv_videoio3 -lopencv_flann3 -lopencv_xobjdetect3 -lopencv_imgcodecs3 -lopencv_objdetect3 -lopencv_xphoto3 -lopencv_imgproc3 -lopencv_core3
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}

 保存即可

### 解决方案概述 为了实现在同一 Ubuntu 18.04 系统中同时管理和使用 OpenCV 4 及 ROS Melodic 自带OpenCV 3.2,可以通过虚拟环境、编译选项配置等方式来实现不同版本库文件的有效隔离与调用。 #### 使用 Python 虚拟环境管理依赖项 创建独立于系统的 Python 环境有助于避免包之间的冲突。对于希望仅在特定项目内使用 OpenCV 4 的情况,推荐采用此方式: ```bash python3 -m venv my_opencv_env source my_opencv_env/bin/activate pip install opencv-python==4.x.y # 安装指定版本的OpenCV 4 ``` 当激活该虚拟环境时,默认会加载其中预设好的 OpenCV 库;而退出后则恢复到全局设置下的状态[^1]。 #### 编译安装自定义路径下的 OpenCV 4 如果需要 C++ 开发支持,则建议通过源码构建并部署至 `/usr/local` 或其他非标准位置上的 OpenCV 4 实例。这样做的好处是可以保持原有 ROS 所需资源不变的同时获得最新特性集: ```bash git clone https://github.com/opencv/opencv.git cd opencv mkdir build && cd $_ cmake .. make -j$(nproc) sudo make install ``` 完成上述操作之后,在编写应用程序时可通过修改 `CMakeLists.txt` 文件中的链接指令指向新安装的位置来确保正确引用所需的 OpenCV 版本[^3]。 #### 利用 Conda 创建多版本共存环境 Conda 是另一个强大的工具,它允许轻松建立多个相互隔离的工作区,并且能够方便地切换所使用的软件栈组合。针对这个问题场景来说,可以这样做: ```bash conda create --name=ros_cv python=3.6 conda activate ros_cv conda install -c conda-forge opencv=4.x.y ``` 这将使得在一个名为 `ros_cv` 的环境中拥有最新的 OpenCV 4 功能,而不影响任何已有的 ROS 组件及其关联组件[^4]。 #### 配置 ROS 工作空间以兼容两个版本 为了让 ROS Project 同时识别两种不同的计算机视觉处理框架,可以在项目的 `package.xml` 中声明对外部依赖关系的要求,比如指明期望使用的最低限度 API 接口等级。与此同时调整对应的 `CMakeLists.txt` 来动态决定实际运行期间应该连接哪个共享对象文件(`.so`),从而达到灵活控制的目的[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值