如何下载新版本opencv见笔者的上一篇文章(传送门)。

这里以ros-noetic和opencv4.8.1为例,默认已经实现了opencv新版本的安装。

本文章引用自这篇:

解决Ubuntu环境下ROS Kinetic中的cv_bridge和自己安装OpenCV 2.4.xx兼容性笔记_ros kinetic opencv-CSDN博客

话不多说直接开始吧。

总所周知,当我们在ros中使用opencv加载onnx文件时可能会遇到加载模型失败的情况,这大概率是因为ros-noetic自带的opencv版本是4.2.0 ,版本太低导致的,这时候就需要使用新版本的opencv。

那么聪明的小伙伴就要发问了,如果我还需要使用cv_bridge进行cv图像和ros消息之间的转换怎么办?因为opencv版本是不能同时加载两个的,所以会导致报错(当cmakelist中存在cv_bridge时,会默认优先调用opencv4.2.0)。

此处采用的办法是修改cv_bridge的配置文件,使其强制调用我们自己下载的新版本opencv。

首先找到cv_bridge的配置文件(大概率是在这里)

cd /opt/ros/noetic/share/cv_bridge/cmake

sudo gedit cv_bridgeConfig.cmake

要修改的地方有两处

1. 按下“ctrl + F”搜索include就可以很快找到,将原来的注释掉,红线部分改为自己下载好的新版本的opencv的对应路径。

防止你们认错,这里的路径下文件长这样(注意,这一步不要写成了clone下来的仓库里的对应路径,一定要是自己指定安装位置的对应路径)

 2. 搜索“lib”就可以很快找到这一坨,这里全部替换成自己安装路径下的库文件(其中所有以.so.4.8.1为后缀的文件即可)

对应路径的文件夹长这样

 因为这段比较长,所以提供一份示例,有需要的自己修改后使用即可

set(libraries "cv_bridge;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_calib3d.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_core.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_dnn.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_features2d.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_flann.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_gapi.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_highgui.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_imgcodecs.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_imgproc.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_ml.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_objdetect.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_photo.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_stitching.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_video.so.4.8.1;/home/lovod/opencv-4.8.1/build/installed/lib/libopencv_videoio.so.4.8.1")

接下来开始修改第二份文件,同样是该目录下

sudo gedit cv_bridge-extras.cmake 

修改红框部分即可 

对应的路径文件夹页面如下

到这里就圆满结束了!!!

测试一下

ROS_WARN("Compiled with OpenCV %s", CV_VERSION);

if (getVersionMajor() != CV_MAJOR_VERSION || getVersionMinor() != CV_MINOR_VERSION)
{
    ROS_FATAL("OpenCV version mismatch! Compiled with %d.%d but runtime is %s",CV_MAJOR_VERSION, CV_MINOR_VERSION, cv::getVersionString().c_str());
    ros::shutdown();
}

ROS_WARN("Linked OpenCV version: %d.%d.%d",
        CV_MAJOR_VERSION,
        CV_MINOR_VERSION,
        CV_SUBMINOR_VERSION);

ROS_WARN("Runtime OpenCV version: %s", cv::getVersionString().c_str());

成功啦!!!完结撒花!!! 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐