解决 cv_bridge 与 opencv4 版本冲突问题

2023-05-16

解决了在 ROS melodic / noetic 下 cv_bridge 与 opencv4 版本冲突导致的 opencv 操作 导致 Segmentation fault (core dumped) 的问题。

目录

  • 问题描述
  • 解决方法
  • 参考

问题描述

在 ubuntu18.04 ROS melodic 下整理好 ORBSLAM3 ROS 功能包后,编译通过,但是运行节点时出现段错误:Segmentation fault (core dumped)
发现错误发生在使用 opencv4 的 cv::FileStorage 读取 yaml 文件处,而这个错误在运行非 ROS 版本的 ORBSLAM3 程序时并不会发生。
即以下代码无法执行:

cv::FileStorage fsSetting("yaml文件路径", cv::FileStorage::READ);
if(!fsSettings.isOpened()){
	cerr << "Failed to open settings file at: " << path << endl;
	exit(-1);
}

当然除了cv::FileStorage,其他 opencv 的操作也可能导致错误。
最后发现在 CMakeLists.txt 中不添加 cv_bridge 包,cv::FileStorage 就能正常读取文件:

find_package(catkin REQUIRED COMPONENTS
	# cv_bridge
)

后来在ubuntu20.04 ROS noetic 下同样是编译通过,运行节点出现段错误,但是出现段错误的点不在 cv::FileStorage 读取 yaml 文件处。

因为 melodic 版本的 cv_bridge 功能包中所用 opencv 版本为 opencv3,所以原因应该是 cv_bridge 与 opencv4 版本冲突
noetic 版本的 cv_bridge 功能包使用的是 opencv4,但是同样会因为 opencv4 版本不一致出现冲突,而在 catkin_make 结束后该冲突只以 warning 的形式提示。

解决方法

解决问题的方法是通过将 cv_bridge 和 我们自己功能包的依赖设为同一版本的 opencv

采用重新编译 cv_bridge 功能包的方法,解决该冲突问题。

  1. 下载 cv_bridge
    下载 noetic 版本的 cv_bridge。(noetic 版本的 cv_bridge 在 melodic 下也能使用,不过要做一些修改,后续会说明)
    下载地址:https://github.com/ros-perception/vision_opencv/tree/noetic
    下载完成后,将 cv_bridge 拷贝到 ros 工作空间的 src 文件夹下。
    为了不影响原来的包,将该文件夹重命名为 cv_bridge_new,并且将文件夹下 CMakeLists.txt 文件中 project 名称修改为 cv_bridge_new:

    project(cv_bridge_new)
    

    并且修改 package.xml 中包的名称:

    <package format="2">
      <name>cv_bridge_new</name>
      ...
    

    在 CMakeLists.txt 文件中指定我们自己的功能包中所用的 opencv4:

    ...
    set(OpenCV_DIR opencv路径/opencv/build)
    set(_opencv_version 4)
    find_package(OpenCV 4 QUIET)
    ...
    
  2. 编译 cv_bridge
    cd 到工作空间的根目录,执行 catkin_make
    在 noetic 版本下直接编译成功,生成名为 cv_bridge_new 的包。
    接下来在自己的功能包中使用 cv_bridge_new 包就行。可跳过去看第 3 步。

    如果是 melodic ,会出现两个问题:
    ① 编译过程中会报错:

    Could not fild the following Boost libraries:
    boost_python37
    

    找不到 boost_python37 库
    在 /usr/lib 文件夹下查找 boost_python ,其实是有这个库的,只不过名字尾缀不为python37,而是 python3。
    可以通过建立软链接的方式让 CMake 找到该库,网上有解决方案。
    也可以直接修改 CMakeLists.txt 文件

    ...
    if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
    # Debian Buster
    find_package(Boost REQUIRED python3)
    ...
    

    ② 重新编译,发现还是会有错误。
    在这里插入图片描述
    参考博客1,修改 cv_bridge_new/src/module.hpp 文件下 void* do_numpy_import()函数为:

    static void do_numpy_import( )
    {
        import_array( );
    }
    

    修改完成后就能成功通过编译。

  3. 使用 cv_bridge_new 包
    在自己的功能包中,修改 CMakeList.txt 文件

    find_package(catkin REQUIRED COMPONENTS
    	cv_bridge_new
    )
    

    修改 package.xml 文件

    ...
    <build_depend>cv_bridge_new</build_depend>
    ...
    <exec_depend>cv_bridge_new</exec_depend>
    ...
    

    注意源文件不需要做任何修改,即不需要修改源文件 include 的 cv_bridge 的头文件名称,虽然我们编译生成的包名修改为了 cv_bridge_new。(参考博客 [2] 中修改源文件的步骤是错误的)
    重新编译,运行节点就能正常使用 opencv4 。

参考

[1] 解决ROS配置中cv_bridge问题:https://zhuanlan.zhihu.com/p/347455336
[2] ROS学习:cv_bridge与opencv版本冲突三种解决方案:https://blog.csdn.net/qinqinxiansheng/article/details/120219388

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决 cv_bridge 与 opencv4 版本冲突问题 的相关文章

  • BeagleBone Black使用(一):狗板简介

    前言 BeagleBone 与 Arduino 和 Raspberry Pi xff08 树莓派 xff09 可以说是目前应用最广泛的三大嵌入式开源平台 而 BeagleBone 在一定程度上可视为融合了 Arduino 与树莓派的优点 x
  • 慧数汽车大数据分析:车市竞争将由打造爆款向构建“产品矩阵”转型

    在车企只要完成年销量三十万辆的目标时 xff0c 只需认认真真培育出一款爆款车就足够了 xff0c 如哈弗H6 完成年销量50万辆的目标时 xff0c 只需认认真真培育出一两款爆款车就足够了 xff0c 如哈弗H6 43 哈弗H2 但为什么
  • 4.10 Python tuple元组详解

    元组 xff08 tuple xff09 是 Python 中另一个重要的序列结构 xff0c 和列表类似 xff0c 元组也是由一系列按特定顺序排序的元素组成 元组和列表 xff08 list xff09 的不同之处在于 xff1a 列表
  • 使用ROS和RealSense直接获取点云

    点云获取 Realsense获取内参创建ROS工作环境创建ROS工作包package向package中添加cpp代码catkin make编译失败失败1 使用ROS订阅节点 xff08 rgb和depth xff09 ROS包安装升级Rea
  • 集成单点登录

    随着现在的系统越来越多 xff08 OA考勤 xff0c 学生宿舍管理等等 xff09 在使用中是不是还在为一次一次的登录而烦恼 xff1f 或者忘了密码而尴尬 xff0c 现在 xff0c 有一个好东西来解决这个问题了 那就是单点登录 单
  • PID算法入门与C语言代码实现

    PID算法的入门理解以及C代码实现 在结束了自控原理的学习后 xff0c 了解到PID算法是一种万能算法 xff0c 在课设中也是经常使用到的一种算法 xff0c 所以想具体的来进行以下总结与学习 xff0c 如果有错漏的地方 xff0c
  • 【Ubuntu18.04安装px4+mavros(解决mavros报错问题)】

    Ubuntu18 04安装px4 43 mavros xff08 解决mavros报错问题 xff09 安装ros melodic重新安装gazebo9 19安装mavros安装px4 我的电脑为联想R7000P2021款 xff0c 之前
  • 嵌入式面试题3

    1 讲一下STM32时钟系统 时钟系统类似于脉搏 xff0c 控制着CPU的命脉 xff0c STM32的时钟源又不像51的时钟源那么单一 xff0c 因为STM32的MCU较为复杂 xff0c 且外设较多 xff0c 并不是所有的外设都需
  • 将 linuxmint 20.2 设置成 mac 主题

    将 linuxmint 20 2 设置成 mac 主题 1 安装Adapta Nokto主题2 安装Numix Circle图标3 安装plank4 设置主题和图标5 设置字体 使用 vmware 安装 LinuxMint20 2 并打造
  • [转载][paper]Threat of Adversarial Attacks on Deep Learning in Computer Vision: A Survey

    文章目录 摘要 深度学习是当前人工智能崛起的核心 在计算机视觉领域 xff0c 它已经成为从自动驾驶汽车到监控和安全等各种应用的主力 虽然深度神经网络在解决复杂问题方面取得了惊人的成功 通常超出了人类的能力 xff0c 但最近的研究表明 x
  • [paper]Feature Squeezing: Detecting Adversarial Examples in Deep Neural Networks

    本文提出了两种特征压缩方法 xff1a 减少每个像素的颜色位深度使用空间平滑来减少各个像素之间的差异 特征压缩通过将与原始空间中许多不同特征向量相对应的样本合并为单个样本 xff0c 从而减少了对手可用的搜索空间 通过将DNN模型对原始输入
  • C# List集合查找删除指定数据

    C List集合查找删除指定数据 文章目录1 实体类2 操作第一个负荷条件数据3 操作所有符合条件数据4 优质源码 文章目录 1 实体类 public class FaultLevelModel public string LBWJ get
  • 【论文阅读】AM-Softmax:Additive Margin Softmax for Face Verification. 1801.05599.【损失函数设计】

    原文链接 xff1a https blog csdn net weixin 43154149 article details 122611784 文章目录 1 四个问题2 论文简介1 Introduction xff08 相关工作 xff1
  • MobaXterm连接出现 Network error: Connection timed out 问题解决

    MobaXterm连接出现 Network error Connection timed out xff1a 接前文 xff1a CentOS安装 点此查看文章 xff0c 安装之后的SSH连接 xff1a 解决思路如下 xff1a 1 检
  • 撰写论文时如何复制参考文献公式----Mathpix及Mathtype教程

    同学们好啊 xff0c 我们在写论文时常常需要使用一些复杂的公式 xff0c 自己对着敲又费时费力 xff0c 那么如何才能讲文献中或者书本上的公式复制在自己的文章中嘞 xff1f 阿阮分享两个公式神器 xff0c 配合使用效果更好哈 xf
  • 驱动及驱动开发的简单理解

    一直对驱动有着强烈的好奇心 xff0c 怎奈工作始终与其无缘 xff0c 且未来也不大可能接触驱动 因此 xff0c 今天用了一些时间 xff0c 去简单的了解了一下驱动及驱动开发 如果有错误的理解 xff0c 请予以指正 xff0c 不胜
  • Mac ping IP+端口

    MacOS中ping IP 43 端口 nc vz w 2 192 168 1 1 8080 windows下 telnet 192 168 1 1 8080
  • 对文件夹下所有灰度图片进行像素值的修改

    最近在跑UNet训练的时候 xff0c 想用自己的数据集做训练 xff0c 发现数据集无法加载进去 xff0c 对比了一下源码所使用的数据集 xff0c 发现是gt的像素值不对导致的 xff0c 为了省事就写了个修改gt像素值的小脚本 im
  • Linux操作系统-信号量

    信号量也属于一种进程间通信的机制 xff0c 与其他的进程间通信不同 xff0c 信号量不是用来传输数据的 xff0c 而是用来进程间同步与互斥 除此之外 xff0c 信号量还可以实现线程间的互斥 信号量是什么 xff1f 信号量的本质是一
  • 你应该知道的 50 个 Python 单行代码

    你应该知道的 50 个 Python 单行代码 1 字母移位词 xff1a 猜字母的个数和频次是否相同2 二进制转十进制3 转换成小写字母4 转换成大写字母5 字符串转换为字节类型6 复制文件7 快速排序8 n 个连续数之和9 赋值交换10

随机推荐

  • npm安装报错ETIMEOUT

    npm安装报错 npm安装报错 xff1a npm ERR code ETIMEDOUT npm ERR errno ETIMEDOUT npm ERR network request to https registry npmjs org
  • JavaScript中的异步

    一 什么叫异步 xff1f 在JS中有同步和异步两种模式 1 同步 xff08 Synchronous xff09 一般指后一个任务等待前一个任务结束 xff0c 程序的执行顺序与任务的排列顺序是一致的 2 异步 xff08 Asynchr
  • 北邮人论坛镜像

    http bbs cloud icybee cn default
  • RLock锁的使用

    try RLock lock 61 redissonClient getLock 34 ppt pos sms code lock 34 43 34 orderSmsCode 34 System out println 34 得到的锁 34
  • Ubuntu开机自动挂载SD卡到指定挂载点并将Docker默认存储路径改为SD卡

    Ubuntu开机自动挂载SD卡到指定挂载点并将Docker默认存储路径改为SD卡 查看磁盘信息查看磁盘原挂载点永久开机自动挂载分区 修改文件 etc fstab应用挂载修改docker默认存储路径 查看磁盘信息 sudo fdisk l 如
  • JS数组对象,过滤掉不要的对象

    其实本来很简单 xff0c 奈何我自己把自己绕进去了 又是觉得自己不适合干开发的一天啊 const array1 61 id null name null id null name null id 1 name 2 我需要筛出不同时为空的数
  • Hadoop权威指南

    1 Hadoop基础知识 第1章 初识Hadoop Hadoop代替配有大量硬盘的数据库来进行大规模数据分析的原因是 xff1a 传输速率 xff08 取决于硬盘的带宽 xff09 的提升远大于寻址时间 xff08 将磁头移动到特定硬盘位置
  • 创建新分支,拉取代码

    1 查看当前已存在分支 git branch 2 创建新的分支 创建一个dev分支 git checkout b dev 3 提交分支到远程仓库 git push origin dev 4 删除本地分支 git branch D dev
  • 操作系统之什么是中断?

    什么是中断 xff1f 在学习操作系统中 xff0c 经常性的会看到中断这个概念 xff0c 最典型的就是汇编代码中的int命令 用一个比较通俗的概念来说 xff0c 就是计算机会连接许多外接设备 xff0c 包括磁盘 显示器 键盘鼠标等等
  • 树莓派断网自动重连WiFi

    树莓派WiFi有时候信号不好会断 xff0c 并不会自动重新连网 解决办法是 xff1a 写一个自动断网重连的脚本 xff0c 让pi定时执行并检查网络是否连通 xff0c 如断网则自动重新连接 连接还是失败 xff0c 重启 1 xff0
  • Flask 中使用 AJAX 异步加载 Bootstrap 表格(Tables)

    Flask 中使用 AJAX 异步加载 Bootstrap 表格 Tables 1 快速安装 2 一步一步做 3 概述 4 项目结构 4 1 Python 部分 app py 4 2 HTML 部分 index html 4 3 Styli
  • OpenMV超声波测距

    OpenMV超声波测距 本文首发于 xff1a https www bilibili com read cv3051569 参考链接 xff1a https blog csdn net bei dai he article details
  • Git常用命令pull、push、fetch

    pull pull意为拉 xff0c 这里引申为拉取代码 在Git命令中使用pull xff0c 会将你的远程代码拉取到本地并进行合并 格式 xff1a git pull lt 远程主机名 gt lt 远程分支名 gt lt 本地分支名 g
  • Ubuntu系统man命令中文汉化

    1 下载中文包 进入 opt xff0c 使用管理权限下载 xff1a wget https src fedoraproject org repo pkgs man pages zh CN manpages zh 1 5 1 tar gz
  • 文末彩蛋 | 这个 Request URL 长得好不一样

    有朋友拿到一个网站请求的链接问这要怎么解密 xff1f 很明显这不是加密的数据 xff0c 这是一张图片 base64 后的结果 xff0c 第一次写爬虫朋友遇到这样的请求 xff0c 可能需要琢磨一下这是什么东西 如果有遇到类似数据 xf
  • Redis(十) 布隆过滤器

    速记 为什么使用布隆过滤器 xff1f 1 为了省内存 xff0c 提高速率 2 因为1所以布隆过滤器不需要百分百正确 3 说存在不一定存在 xff0c 说不存在一定不存在 4 在解决缓存穿透的问题时 xff0c 拦截了大部分的请求 xff
  • 第五章:数学运算-statistics:统计计算-平均值

    5 5 statistics 统计计算 statistics模块实现常用的统计公式 xff0c 允许使用python的各种数值类型 xff08 int float xff0c Decimal和Fraction 来完成高效计算 5 5 1 平
  • 用proxychains4解决rosdep init问题教程

    在终端下载源码 sudo git clone https github com rofl0r proxychains ng git 进入安装目录 cd proxychains ng 配置 configure prefix 61 usr sy
  • 使用 TX2 和 realsense D435i 相机运行 ORBSLAM3

    非 ROS 版本 之后可能会更新 ROS 版本的 ORBSLAM3 配置指南 TODO 目录 TX2 刷机JetPack 4 6 1安装 realsense SDK 2 0编译 opencv 4 5 0编译 Pangolin 0 5编译运行
  • 解决 cv_bridge 与 opencv4 版本冲突问题

    解决了在 ROS melodic noetic 下 cv bridge 与 opencv4 版本冲突导致的 opencv 操作 导致 Segmentation fault core dumped 的问题 目录 问题描述解决方法参考 问题描述