关于ros与opencv版本冲突cv_bridge报错
的解决办法:
1.我的环境:ubuntu18.04+ros melodic +opencv4.5.5
2.问题:最近在跑课程项目,因为我的linux放在移动硬盘里面嘛,所以运行速度不是很快,我一般会在windows里写好再去linux,如果大家的linux不卡顿,建议大家开始写代码的时候就在linux的环境。我的windows中opencv版本是4.5.5,就是目前的最新版。写好后我就移动到linux下面嘛。编译报错,百度一下是因为linux的opencv版本太低了,需要升级,我想了一下反正早晚都得用新的,升级呗。于是卸载了老版本的opencv,安装了新的,我觉得不少小伙伴也和我一样。哎,这就是入坑的第一步啊……
问题的样子:我的ros程序需要用到cv_bridge,这才是真正的问题,如果大家不需要cv_bridge的话一般不会出现错误……书回正传;在以前版本的使用的cv_bridge程序现在用不了了,并且程序会报错如下:
OpenCV Error: Assertion failed (tlsSlots.size() > slotIdx) in releaseSlot, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core/src/system.cpp, line 1092 terminate called after throwing an instance of ‘cv::Exception’ what(): /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core/src/system.cpp:1092: error: (-215) tlsSlots.size() > slotIdx in function releaseSlot
咋办呢,百度呗,百度得到了结果还是挺令人满意的,下面这几个博主讲述的解决办法都非常详细,但是……不知道为啥我是没有解决这个问题的……
方案一:修改ros目录下关于cv_bridge的文件:
https://blog.csdn.net/Shushan1/article/details/116588614?spm=1001.2014.3001.5506
https://blog.csdn.net/bigdog_1027/article/details/79092263
这二位前辈写的非常非常非常详尽!大家可以先去试一下!
方案二:我成功的方案,安装最新版的cv_bridge,使用时需要在工作空间的Cmakelists文件里写明新的cv_bridge路径。
这里还是看到了这位博主的文章:
https://blog.csdn.net/qq_36814762/article/details/110230127?spm=1001.2014.3001.5506
方法可行,但这篇文章过去两年,而且我用的时opencv4,不知道会出什么幺蛾子,百度了一下选择安装最新版适应opencv4的cv_bridge,这里不要安装这个官方网址下面的包包https://github.com/ros-perception/vision_opencv,因为opencv4.5.5最近才出,所以官网文件里还有很多不兼容的地方。我刚开始并不知道这样的情况,甚至想要放弃了,后来我在github上找到了解决办法。这里插一句:小伙伴们需要什么包的时候多去github上翻翻,出了问题可以在该包对应的issues那里搜索自己的问题,一般都有人遇到过,没有的话可以提问,记得把自己的环境讲清,比如我:ubuntu18+opencv4.5.5……会有大佬帮助的!github上对于cv_bridge不兼容opencv高版本是这样解释的:
Since OpenCV4 is released a month ago, this package doesn’t compile. This PR adds compatibility for OpenCV4.
Regarding the
module_opencv4.cpp
, it’s probably not the most future proof way to do this, but the package already seems to handle opencv2/3 this way so I just amended it.
这位大佬给出了适合opencv4版本的cv_bridge!
大家跟我一起做:
首先 随便找个地方建立工作空间,比如:
$ cd ~
$ mkdir -p catkin_ws/src
随后一起来吧!:
$ cd catkin_ws/src
$ catkin_init_workspace
$ cd ..
$ cdtkin_make
$ cd src
之后大家得去网址:https://github.com/fizyr-forks/vision_opencv/tree/opencv4下载压缩包,百步网盘也OK,我发现用git下载的东西和压缩包下载不一样而且会编译失败,下载后把压缩包里的cv_bridge工程文件放在src目录下即可
网盘链接:
链接:https://pan.baidu.com/s/1VB1JoMuIrz27SsAgjV5irw?pwd=0000
接下来需要改一下cv_bridge包下的cmakelists.txt文件:
$ gedit cv_bridge/CMakeLists.txt
这一部分:
cmake_minimum_required(VERSION 2.8)
project(cv_bridge)
//在这加个东西
find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)
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 REQUIRED //这里需要改
COMPONENTS
opencv_core
opencv_imgproc
opencv_imgcodecs
CONFIG
)
修改如下:
cmake_minimum_required(VERSION 2.8)
project(cv_bridge)
set(OpenCV_DIR "/usr/local/include/opencv4/opencv2") #opencv库的路径,大家应该都一样,加上的,自己加的时候给我这句话删掉,看着多难受,
find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)
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 4.5 REQUIRED #改成4.5
COMPONENTS
opencv_core
opencv_imgproc
opencv_imgcodecs
CONFIG
)
接下来进行编译:
$ cd ~/catkin_ws/
$ catkin_make
成功啦!,但是还没结束哈,使用的时候在自己的工作空间中CmakeLists.txt需要添加:
set(cv_bridge_DIR ~/catkin_ws/devel/share/cv_bridge/cmake)#大家根据自己的情况修改就好!
set(OpenCV_DIR "/usr/local/include/opencv4/opencv2")
编译你报错的ros文件,呜呜呜成功啦!!!!
感谢csdn前辈,github上的前辈们(特别是这位提出来方案https://github.com/hgaiser)!感激涕零!!!!
另外,最近准备考研,大家如果有问题不能及时回复的~大家就看看有没有更好的解决方案哈……