ROS2下编写package利用orbbec相机进行yolov8实时目标检测

视频讲解

ROS2下编写package利用orbbec相机进行yolov8实时目标检测

在《ROS2下编写orbbec相机C++ package并Rviz显示》的基础上,继续添加对获取的图像使用YOLO进行目标检测

首先安装YOLO以及相关库

pip3 install ultralytics 

使用如下指令测试下yolo安装情况

yolo task=detect mode=predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'

成功会在当前位置下生成runs,如下图为检测加上标签的图片,确认yolo调用成功

接下来使用orbbec发布的图像,进行YOLO实时识别

编写yolo识别package

ros2 pkg create --build-type ament_python yolo_target_detection --dependencies rclpy sensor_msgs cv_bridge

指定依赖项 rclpy(ROS 2 Python 客户端库)、sensor_msgs(用于处理图像消息)和 cv_bridge(用于在 ROS 图像消息和 OpenCV 图像之间进行转换)

在src/yolo_target_detection/yolo_target_detection目录下创建一个 Python 脚本,例如yolo_target_detection.py,并添加以下代码:

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
from ultralytics import YOLO
import numpy as np
from std_msgs.msg import Header
from sensor_msgs.msg import Image as ROSImageclass YoloTargetDetectionNode(Node):def __init__(self):super().__init__('yolo_target_detection_node')# Initialize the YOLOv8 modelself.model = YOLO("yolov8n.pt")  # 选择你训练的模型self.bridge = CvBridge()# Create a subscriber for RGB imageself.image_sub = self.create_subscription(Image,'/rgb_image',  # 修改为你订阅的topicself.image_callback,10)# Create a publisher for output image with bounding boxesself.obb_pub = self.create_publisher(ROSImage,'/obb_image',10)def image_callback(self, msg):try:# Convert ROS Image message to OpenCV imagecv_image = self.bridge.imgmsg_to_cv2(msg, "bgr8")except Exception as e:self.get_logger().error(f"Error converting image: {e}")return# Perform object detection using YOLOv8results = self.model(cv_image)# YOLOv8 returns a list of results, each result is a Results objectresult = results[0]  # Get the first result (assuming single image inference)# Get bounding boxes, class IDs, and confidencesboxes = result.boxes.xywh.cpu().numpy()  # Bounding boxes (x_center, y_center, width, height)confidences = result.boxes.conf.cpu().numpy()  # Confidence scoresclass_ids = result.boxes.cls.cpu().numpy()  # Class IDslabels = result.names  # Class names# Draw bounding boxes on the imagefor i, box in enumerate(boxes):x_center, y_center, width, height = box[:4]confidence = confidences[i]class_id = int(class_ids[i])  # Get the class IDlabel = labels[class_id]  # Get the class label# Convert center to top-left coordinates for cv2x1 = int((x_center - width / 2))y1 = int((y_center - height / 2))x2 = int((x_center + width / 2))y2 = int((y_center + height / 2))# Draw bounding box and label on the imagecv2.rectangle(cv_image, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.putText(cv_image, f"{label} {confidence:.2f}", (x1, y1 - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0), 2)# Convert the image with bounding boxes back to ROS messagetry:obb_image_msg = self.bridge.cv2_to_imgmsg(cv_image, encoding="bgr8")obb_image_msg.header = Header()obb_image_msg.header.stamp = self.get_clock().now().to_msg()obb_image_msg.header.frame_id = "camera_frame"  # 根据你的相机frame进行调整# Publish the image with bounding boxesself.obb_pub.publish(obb_image_msg)self.get_logger().info("Published object-bound box image.")except Exception as e:self.get_logger().error(f"Error publishing image: {e}")def main(args=None):rclpy.init(args=args)node = YoloTargetDetectionNode()try:rclpy.spin(node)except KeyboardInterrupt:passfinally:node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

打开src/yolo_target_detection/setup.py文件,添加以下内容:

[develop]
script_dir=$base/lib/yolo_target_detection
[install]
install_scripts=$base/lib/yolo_target_detection

在终端中执行以下命令构建和安装包:

colcon build --packages-select yolo_target_detection
source install/setup.bash
ros2 run yolo_target_detection yolo_target_detection

打开Rviz及Orbbec节点发布rgb_image消息即可,同时配置Rviz增加新的image显示,订阅消息为obb_image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22151.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp引入uview组件库(可以引用多个组件)

第一步安装 npm install uview-ui2.0.31 第二步更新uview npm update uview-ui 第三步在main.js中引入uview组件库 第四步在uni.scss中引入import "uview-ui/theme.scss"样式 第五步在文件中使用组件

UE5.3 C++ TArray系列(一)

一.TArray概述 它们就相当于C动态数组Vector,但是被UE封装了,懂得都懂反射嘛,要不一不小心就被回收了。 它真的非常常见,我所用的容器中,它绝对排名第一,第二是TMap。 同类好理解,我平时也常用…

R语言NIMBLE、Stan和INLA贝叶斯平滑及条件空间模型死亡率数据分析:提升疾病风险估计准确性...

全文链接:https://tecdat.cn/?p40365 在环境流行病学研究中,理解空间数据的特性以及如何通过合适的模型分析疾病的空间分布是至关重要的。本文主要介绍了不同类型的空间数据、空间格点过程的理论,并引入了疾病映射以及对空间风险进行平滑处理…

一款社交媒体中查用户名的工具

简介 追踪 400 多个社交网络中的用户名社交媒体账户以查找账户 安装 # python环境 pip安装 pip install sherlock-project # Mac环境 brew安装 brew install sherlock # docker安装 docker pull sherlock/sherlock 使用方式 ->$ sherlock -h usage: sherlock [-h] [-…

unity学习50:NavMeshAgent 区域Areas和cost

目录 1 NavMeshAgent 区域和成本的问题 2 区域Areas 2.1 区域和颜色 2.2 区域和成本 2.3 区域成本的作用 2.4 地图测试准备 2.5 如何实现 2.5.1 unity的2022之前的老版本 2.5.2 unity的2022之后的新版本 2.6 如果测试失败,是因为没有bake 2.7 测试前&…

JAVA版本游戏进程读写操作

1.导入游戏进程读写Maven依赖 <dependency><groupId>io.github.2lius</groupId><artifactId>MemoryProcess</artifactId><version>0.1</version></dependency> GitHub地址 2.代码操作游戏读写内存 package com.lius.test;impo…

英文字体:极简现代浓缩未来派科技海报标题排版无衬线字体 PODIUM Sharp Font

PODIUM Sharp 是 2012 年设计的 DUDU 字体的扩展版本。多年后&#xff0c;我决定通过添加新的母版和粗细来重建和开发这种字体。最后&#xff0c;PODIUM Sharp 由 234 种款式组成&#xff1a;从超压缩发际线到超扩展重度。 这个项目的主要目的是在我在旧波兰标本中发现的不同模…

JEEWMS cgFormBuildController.do 方法mobileForm存在SQL注入

一:登录扫描 JeeWMS是一款免费开源的仓库管理系统,支持3PL和厂内物流,涵盖订单管理,仓储管理,计费管理,现场作业,RFID,AGV等功能。本文介绍了系统的简介,功能,安装,截图和链接,适合仓储企业和开发者参考。厦门市灵鹿谷科技有限公司JEEWMS jeecgFormDemoController…

谷粒商城—分布式高级②.md

认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…

华为昇腾910b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…

【C++】 Flow of Control

《C程序设计基础教程》——刘厚泉&#xff0c;李政伟&#xff0c;二零一三年九月版&#xff0c;学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…

开源免费文档翻译工具 可支持pdf、word、excel、ppt

项目介绍 今天给大家推荐一个开源的、超实用的免费文档翻译工具&#xff08;DeeplxFile&#xff09;&#xff0c;相信很多人都有需要翻译文档的时刻&#xff0c;这款工具就能轻松解决你的需求。 它支持多种文档格式翻译&#xff0c;包括 Word、PDF、PPT、Excel &#xff0c;使…

30 款 Windows 和 Mac 下的复制粘贴软件对比

在日常电脑操作中&#xff0c;复制粘贴是极为高频的操作&#xff0c;一款好用的复制粘贴软件能极大提升工作效率。以下为你详细介绍 30 款 Windows 和 Mac 下的复制粘贴软件&#xff0c;并对比它们的优缺点&#xff0c;同时附上官网下载地址&#xff0c;方便大家获取软件。 Pa…

Unity学习笔记-Unity了解,安装,简单配置(一)

Unity 是什么&#xff1f; Unity 是一款广受欢迎的跨平台游戏开发引擎&#xff0c;由 Unity Technologies 公司开发并推出。它以强大的功能和易用性&#xff0c;在游戏开发领域占据着举足轻重的地位&#xff0c;甚至可以说&#xff0c;它改变了游戏开发的格局。凭借其出色的跨…

【JavaWeb学习Day17】

Tlias智能学习系统&#xff08;员工管理&#xff09; 新增员工&#xff1a; 三层架构职责&#xff1a; Controller&#xff1a;1.接收请求参数&#xff08;员工信息&#xff09;&#xff1b;2.调用service方法&#xff1b;3.响应结果。 具体实现&#xff1a; /***新增员工…

基于windows的docker-desktop安装kubenetes以及dashboard

我们需要k8s环境做各种小实验可以本地安装一个&#xff0c;这里介绍win11如何通过docker-desktop安装k8s以及通过helm安装dashboard。 下载docker-desktop地址https://www.docker.com/get-started/打开【控制面板】->打开【启用和关闭windows功能】->分别勾选【hyper-v】…

Vue2是如何利用Object.defineProperty实现数据的双向绑定?

我们之前说道过Object.defineProperty方法有一关键特性&#xff0c;就是数据劫持&#xff0c;通过get/set 拦截属性的读取和修改操作。Vue主要是通过数据劫持结合发布-订阅模式来实现的&#xff0c;利用Object.defineProperty来劫持各个属性的setter和getter&#xff0c;在数据…

【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…

基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,医生,科室信息,就诊信息,医院概况,挂号信息,诊断信息,取消挂号 开题报告内容 基于FlaskVue框架的医院预约挂号系统开题报告 一、研究背景与意义 随着医疗技术的不断进步和人们健康意识的日益增强&#xff0c;医院就诊量逐年增加。传统的现场…

影刀RPA中级证书-Excel进阶-开票清单

1.操作题需求 请参照视频内容&#xff0c;将开票账单表格中的数据整理成开票清单。请下载 开票账单.xlsx 整理规则如下&#xff1a; 1. 金额为0的数据为赠品&#xff0c;无需开票&#xff0c;需删除2. 开票清单需要从开票账单中获取的数据包括有开票名称、数量、金额、税率&…