运用ROS和OpenCV进行简单的图像处理之检测

2023-05-16

本文主要讲述在ROS下使用opencv进行图像处理,并给出了一个详细示例。


首先建立一个ros包,在CMakeLists.txt中加入以下代码段,用于找到并链接OpenCV。安装完整版的ROS会顺带把OpenCV 2.4.x也装了,不过可能不太完整,缺一些头文件或者库之类的。最好自己再装一遍,直接去OpenCV官网或者github下载源码编译安装,也可对Ubuntu系统下安装依赖性有进一步了解。如系统中存在多个opencv版本的情况,可参考《ubuntu 安装使用多版本opencv》这篇博客。

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

在ROS中通过cv_bridge包实现ros图像和opencv图像的转换,通过image_transport包订阅和发布图像数据。

此外,ros indigo版本的cv_bridge依赖于opencv2.4.x。如果自己装的版本过高,可能会存在兼容性问题,导致图像或视频无法加载。其解决办法可参考博文《OpenCV 3与ROS兼容、OpenCV多版本共存》,主要是下载cv_bridge后重新编译。

ROS和OpenCV的关系图如下,图片来源于ros官网。


下面介绍一个简单的图像处理示例,实现对黑色条纹的检测(有点类似于智能车比赛的摄像头组微笑)。由于黑色像素较为明显,因此先对图像进行灰度处理变成单通道的,再进行Ostu阈值分割(大津法),得到二值化的图像就只有0和1了,其中为0的部分为黑色。

关键代码段如下:

    cv::Mat image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR);
    cv::Mat gray;
    cv::Mat edges;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    cv::threshold(gray, edges, 76, 255, CV_THRESH_OTSU);   //参数76可设置成自动调节

我写了两个节点,一个用于加载图像并进行图像,一个用于显示图像,两个要同时运行才可看到效果。运行时别忘了source工作空间,并打开roscore。

rosrun img_process read_img_node argv[1]
rosrun img_process show_img_node

运行中的效果截图如下:


以上是针对静态图像的处理,如果视频流和从摄像头获取的,图像处理的过程还是一样,只是获取的地方改成如下:

cv::VideoCapture cap(argv[1]);   //传入摄像头参数或视频文件目录
if(!cap.isOpened())
    return;
cv::Mat frame;
cap >> frame;                    //这样便可实时获取图像数据

此外,笔者还提供了matlab程序进行同样的处理,效果如下(貌似在ros下效果好点微笑):



不过总的来说,这只是一个简单的示例,实际运用中还有很多没有考虑的地方,如光照、噪点等。


整个工程的源代码在下面的网址可以下到:

https://github.com/WelinLee/ROS_OPENCV_PRO


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

运用ROS和OpenCV进行简单的图像处理之检测 的相关文章

  • 如何显示图像

    我尝试使用 IPython display 与以下代码 from IPython display import display Image display Image filename MyImage png 我还尝试使用 matplotl
  • WebRTC 与 python

    我想用 python twisted 制作一个流服务器 它接收 WebRTC 视频流 然后对其应用一些 OpenCV 算法 但是我找不到 WebRTC 的 python 模块 如何使用 python twisted 发送和接收 WebRTC
  • OpenCV 无法从网络摄像头捕获帧

    我在 VS2010 中使用 OpenCV 2 4 6 我认为我的网络摄像头无法捕获该帧 当我执行代码时 它构建成功 但我没有得到输出 我想 当我检查时if bSuccess 它已执行并且无法从网络摄像头捕获帧 我该如何解决这个问题 我的代码
  • 使用 OpenCV 进行图像捕获 - 选择超时错误

    我想保存从连接 BeagleBone Black 的网络摄像头捕获的图像 但是当我运行以下代码时 出现错误 选择超时 include
  • OpenCV:将 cvGoodFeaturesToTrack 与 C++ mat 变量结合使用

    我正在尝试使用cvGoodFeatureToTrackVisual Studio 2010 中的函数 图像类型为Mat 我见过的大多数例子都使用IplImage指针 现在我有这个 int w h video frame size Mat g
  • 如何使用 OpenCV 和 Python 通过检测到的脸部和眼睛来移动鼠标

    我已经成功地通过在脸部和眼睛周围绘制循环来检测它们 并且在 Python 教程的帮助下工作得很好Python教程 https docs python org 3 5 tutorial index html 学习 OpenCV http ww
  • java.library.path 中没有 opencv_java300 [重复]

    这个问题在这里已经有答案了 提前致谢 我有一个项目使用opencv 300 jar作为外部库 我在 eclipse 中尝试过这个网豆 当我从 IDE 本身运行我的项目时 这两种方法都可以成功运行 我希望我的项目将其导出为可运行 或可执行 j
  • 裁剪图像后,如何找到新的边界框坐标?

    这是我得到的收据图像 我使用 matplotlib 绘制了它 x1 y1 x2 y2 x3 y3 x4 y4 bbox coords 650 850 1040 850 1040 930 650 930 image cv2 imread IM
  • 在 np.array 上应用 cv2.boundingRect

    如何申请cv2 boundingRect to a np array点 以下代码会产生错误 points np array 1 2 3 4 dtype np float32 import cv2 cv2 boundingRect point
  • 在多处理进程之间将 opencv 视频帧共享为 Numpy 数组的正确方法

    我想与我的多处理子进程共享 OpenCV 中的捕获帧 但是video capture read 创建一个新对象 并且不会写入我将通过包装它来共享的 numpy 数组multiprocessing Array 这是代码 ret frame v
  • ORB 演示代码出现 cv2.error 错误:来自 OpenCV 代码的未知 C++ 异常

    ORB 演示代码位于https opencv python tutroals readthedocs io en latest py tutorials py feature2d py orb py orb html https openc
  • 如何使用浮点数组中的数据初始化 cv::Mat

    我需要创建一个cv Mat用我的数据初始化的变量float 大批 这应该是基本的 但我很难弄清楚 我有代码 float matrixAB lt 120 floating point array created elsewhere gt cv
  • 将 vec3b 转换为 mat

    我有彩色图像im 我想使用以下代码使用 vec3b 获取 3 通道图像的像素值 for int i 0 i lt im rows i for int j 0 j lt im cols j for int k 0 k lt nChannels
  • 改进 cvFindChessboardCorners

    不幸的是 我无法找到我的问题的任何解决方案 我想做的是使用 OpenCV 方法改进结果cvFindChessboardCorners为了能够实现更好的相机校准 因为我认为这就是为什么我在不扭曲 校正图像时得到较差结果的原因 就像我之前的问题
  • pytesseract 无法按预期识别文本?

    我正在尝试通过 opencv 和 pytesseract 运行一个简单的车牌图像来获取文本 但我无法从中获取任何内容 按照此处的教程进行操作 https Circuitdigest com microcontroller projects
  • 如何对使用 SimpleITK 读取的 DICOM 图像进行直方图均衡化

    我正在尝试对从 nii gz 文件读取的所有图像进行直方图均衡 我试过这段代码 import SimpleITK as sitk flair file content gdrive My Drive Colab Notebooks FLAI
  • 图像中土壤颗粒分水岭以外的替代分割技术

    我正在寻找一种替代方法来分割以下土壤颗粒图像中的颗粒 而不是Python中的分水岭分割 因为它可能会误导对颗粒的正确检测 此外 我正在研究边缘检测图像 使用HED算法 作为附加 我希望找到一种更好的方法来分割颗粒以进行进一步处理 因为我想获
  • 使用 Python 和 OpenCV 改善图像歪斜校正

    我生成的用于检测和纠正偏差的代码给了我不一致的结果 我目前正在开展一个项目 该项目利用图像上的 OCR 文本提取 通过 Python 和 OpenCV 因此如果需要准确的结果 消除倾斜是关键 我的代码使用cv2 minAreaRect来检测
  • 霍夫变换的累加器填充

    我写了一段需要优化的代码 只是想与社区核实一下该代码是否确实是最佳的 它填充霍夫变换的累加器 实际上 我只是复制粘贴了 OpenCV 库中的大部分代码 谢谢 int i j n index for i 0 i
  • Android Camera2 API - 实时显示处理后的帧

    我正在尝试创建一个实时处理相机图像并将其显示在屏幕上的应用程序 我正在使用camera2 API 我创建了一个本机库来使用 OpenCV 处理图像 到目前为止 我已经成功设置了一个 ImageReader 来接收 YUV 420 888 格

随机推荐

  • 2013年:一个技术领导的启程

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 又到一年总结时 总的来说 xff0c 这一年忙碌而充实 xff0c 现在有点胸中有千言却又不知从何说起 可能每一个希望有所作为的开发人员都
  • STM32——硬件IIC从机通信

    前言 xff1a 根据网上的资料 xff0c 大部分网友表示STM32自带的硬件IIC存在bug xff0c 读写时很容易卡死 自己在调试的时候也出现卡死的情况 xff0c 最后一点一点调试 xff0c 也还是调通了 本文将记录自己调试ST
  • HI3516的编译参数-mcpu=cortex-a7、-mfloat-abi=softfp和-mfpu=neon-vfpv4

    前言 Hi3516A具有浮点运算单元和neon 文件系统中的库是采用软浮点和neon编译而成 xff0c 因此所有Hi3516A板端代码编译时需要在Makefile里面添加选项 mcpu 61 cortex a7 mfloat abi 61
  • 算法移植优化基础

    PS xff1a 为了面试准备的 xff0c 总结的有点粗糙 ARM xff1a Advanced RISC Machines xff0c ARM架构是面向低预算市场设计的第一款RISC微处理器 xff0c 基本是32位单片机的行业标准 x
  • DBoW2在windows上的vs工程搭建方法

    xfeff xfeff 注释 xff1a 蓝体字是 opencv249 专用的修改 xff1b 黑体字是 opencv3 需要的修改 环境 xff1a vs2012 32bit 叙述比较简略 不明之处可以留言 1 配置 opencv 2 4
  • MSCKF_vio学习笔记

    最近因为项目需求 xff0c 对MSCKF vio的论文和代码进行了一番研读 xff0c 现将学习过程记下 MSCKF vio是一种基于多状态约束卡尔曼滤波器的双目视觉里程计 其中多状态约束是指将多帧图像的相机位姿加入卡尔曼状态向量中 xf
  • MSCKF2.0(Mingyang Li-IJRR2013) 论文要点总结

    论文 xff1a Li M Mourikis A I High precision consistent EKF based visual inertial odometry J The International Journal of R
  • SLAM,SLAM+IMU的状态估计问题描述-个人理解

    1 状态估计问题 令状态变量为x 61 x1 x2 x3 观测变量为z 61 z1 z2 z3 状态估计问题等同于求解条件概率分布 xff1a P x z xff0c 在当前观测状态z下的状态x分布 xff0c 也就是最可能的状态是什么 由
  • VINS-Fusion运行时的段错误(核心已转储)解决方法

    平台 ubuntu16 04 43 ROS 问题描述 xff1a 前两天VINS的原作者开源了VINS Fusion的双目版以及给出了和GPS融合的一个demo xff0c 所以试着运行下数据集 每次单目运行10s左右 xff0c 双目1
  • Jetson Xavier NX 刷机+更换清华源完美讲解

    当你拿到梦寐以求的NVIDIA Jetson Xavier NX开发板时 xff0c 第一个工作就是要刷机 究竟要怎么做呢 xff1f Let s go 这种板子有两种 xff0c 一种是带Micro SD卡槽的 xff0c 可以插入小型S
  • vmware下vmdk文件越来越大的解决方法探讨

    前段时间在vmware下面安装了ubuntu镜像 xff0c 用了一段时间后发现ubuntu的vmdk文件越来越大 xff0c 达到了31 6GB xff0c 如下图所示 而且随着继续安装新的软件仍然在增大中 即使在ubuntu里面删除了文
  • 工作日志的作用

    朱金灿 公司提倡我们每天都写工作日志 这使得我思考工作日志的作用 我想了一下 xff0c 工作日志应该要起两个作用 xff1a 1 计划作用 俗话说 xff1a 凡事预则立 xff0c 不预则废 最好在每天开始工作前先在工作日志上写下今天要
  • Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)

    原文 xff1a http blog csdn net zcshoucsdn article details 54670473 最近公司搞新项目 xff0c 需要使用FreeRTOS xff0c 之前只有Linux的基础 xff08 学了个
  • 职场 | Intel因特尔2019届软件工程师秋招笔试题

    同样的本文是对笔试过程中 xff0c 仍然记得的考点的查漏补缺 一共分为三部分 xff1a 选择题 编程题 附加题 时间是两个小时 xff0c 个人感觉因特尔的笔试题对于内核 xff0c 内存管理等方面的考点较多 xff0c 具体属于什么科
  • Linux-LCD驱动实现

    一 帧缓冲设备驱动在Linux子系统中的结构 xff1a 二 帧缓冲相关的重要数据结构 从帧缓冲设备驱动程序结构 看 xff0c 该驱动主要跟fb info结构体有关 xff0c 该结构体记录了帧缓冲设备的全部信息 xff0c 包括设备的设
  • ROS之命名空间

    已经学ROS快两个月了 xff0c 一开始对ROS 命名空间 xff0c 参数 xff0c 参数服务器 xff0c 重映射没认真看 xff0c 后来发现很重要 xff0c 它是学习ROS代码的基础 我们都知道ros以topic通信 xff0
  • CircleProgressBar 一个界面漂亮功能强大的圆形进度条,支持多种属性

    CircleProgressBar 项目地址 xff1a HuTianQi CircleProgressBar 简介 xff1a 一个界面漂亮功能强大的圆形进度条 xff0c 支持多种属性 xff0c 如圆环的大小颜色 xff0c 进度条的
  • Android 串口调试助手

    Android SerialPort Tool 项目地址 xff1a licheedev Android SerialPort Tool 简介 xff1a Android 串口调试助手 更多 xff1a 作者 提 Bug 标签 xff1a
  • 树莓派IIC通讯获取BMI08x IMU数据进行姿态解算,并通过UART/TCP在rviz上显示

    截至2021年 xff0c 树莓派出的最新款应该是Raspberry Pi 400 xff0c 设计得跟键盘一样 xff0c 很难想象到这是个树莓派 xff0c 尤其是它的标语写的很好 你的下一个电脑 xff0c 何必是电脑 xff0c 不
  • 运用ROS和OpenCV进行简单的图像处理之检测

    本文主要讲述在ROS下使用opencv进行图像处理 xff0c 并给出了一个详细示例 首先建立一个ros包 xff0c 在CMakeLists txt中加入以下代码段 xff0c 用于找到并链接OpenCV 安装完整版的ROS会顺带把Ope