D435相机结合Yolo V8识别出目标物体,并转点云出抓取位姿。

2024-06-05 17:04

本文主要是介绍D435相机结合Yolo V8识别出目标物体,并转点云出抓取位姿。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近项目上需要完成整个识别、定位、到最后的抓取流程。
分享一下,通过使用D435相机并结合Yolo V8识别出目标物体后,抠取出目标物体部分的有效深度图,最后将前景物体部分的RGB

D435相机结合Yolo V8识别出目标物体,并转点云出抓取位姿

  • 1、D435相机取流
  • 2、D435结合Yolo V8实时检测
  • 3、扣取指定物体的深度图
    • 3.1 扣取指定物体的mask
    • 3.2 根据mask扣取物体有效深度部分
  • 4、 结合相机内参转物体点云
  • 5、 抓取

1、D435相机取流

使用pyrealsense2进行RGB-D获取视频流,这里最大的坑其实就是每一帧得做一个RGB-D帧间的对齐。

import cv2
import numpy as np
import pyrealsense2 as rspipeline = rs.pipeline()
align_to = rs.stream.color
align = rs.align(align_to)
config = rs.config()
D400_imgWidth, D400_imgHeight = 640, 480
config.enable_stream(rs.stream.color, D400_imgWidth, D400_imgHeight, rs.format.bgr8, 30)
config.enable_stream(rs.stream.depth, D400_imgWidth, D400_imgHeight, rs.format.z16, 30)profile = pipeline.start(config)while True:frames = pipeline.wait_for_frames()# RGB-D对齐aligned_frames = align.process(frames)aligned_color_frame = aligned_frames.get_color_frame()aligned_depth_frame = aligned_frames.get_depth_frame()if not aligned_depth_frame or not aligned_color_frame:raise Exception("[info] No D435 data.")rgb = np.asanyarray(aligned_color_frame.get_data())d = np.asanyarray(aligned_depth_frame.get_data())if len(rgb):cv2.imshow("RGB", rgb)cv2.imshow("D", rgb)if cv2.waitKey(1) & 0xFF == ord("q"):break

2、D435结合Yolo V8实时检测

其实就是将D435的RGB流按照循环逐帧送进Yolo V8进行推理
from ultralytics import YOLOmodel = YOLO(r"/train/weights/best.pt")
while True:frames = pipeline.wait_for_frames()aligned_frames = align.process(frames)aligned_color_frame = aligned_frames.get_color_frame()aligned_depth_frame = aligned_frames.get_depth_frame()if not aligned_depth_frame or not aligned_color_frame:raise Exception("[info] No D435 data.")rgb = np.asanyarray(aligned_color_frame.get_data())d = np.asanyarray(aligned_depth_frame.get_data())if len(rgb):results = model(rgb, conf=0.25)annotated_frame = results[0].plot()cv2.imshow("YOLOv8 Inference", annotated_frame)if cv2.waitKey(1) & 0xFF == ord("q"):break

3、扣取指定物体的深度图

3.1 扣取指定物体的mask

正常场景中只有一小部分是我们想要的,比如说一张桌面上有许多物件,但我只想识别、或者后期只抓绿色的杯子。那么就需要将Yolo V8检测出来的所有结果进行后处理,筛出我们想要的物体。

// An highlighted block
'''进行深度学习前向传播推理'''
results = model(color_img, conf=0.25)
# 封装后处理函数,只保留指定“input”的mask。
def backward_handle_output(results , color_img, depth_img, nc, input):center = Nonecls = []mapped_depth = Noneannotated_frame = output[0].plot()mask = None# 如果检测到物体,也就是mask不为空时if results [0].masks is not None:# 获取所有检测框所属的类别 for cls_idx in range(len(output[0].boxes)):cls.append(output[0].names.get(int(output[0].boxes.cls[cls_idx].item())))# 只留下指定的“input”类别物体if input in cls:# 根据“input”对应的索引号,获取其maskcls_idx = cls.index(input)mask = np.array(output[0].masks.data.cpu())[cls_idx] 

3.2 根据mask扣取物体有效深度部分

正常会通过深度图结合相机内参来转点云,所以如果我们只想要将我们待检测的物体部分的深度图转成点云图,那这样就可以过滤掉不相关的物体或背景。

# 判断非指定物体的有效区域
channel_zeros = mask == 0
'''初始化一个与原始深度图类型的一致的全0深度图'''
mapped_depth = np.zeros_like(depth_img)
'''也就是我们指定“input”物体mask区域对应的位置的深度信息抠出来,剩下非物体有效区域深度值全置为0'''
# 这样,我们就成功晒出了物体部分的深度值,其余全为背景0。
mapped_depth[~channel_zeros] = depth_img[~channel_zeros]
mapped_depth[channel_zeros] = 0

4、 结合相机内参转物体点云

import open3d as o3d
pcd = o3d.geometry.PointCloud()def create_point_cloud_from_depth_image(depth, camera, organized=True):""" Generate point cloud using depth image only.Input:depth: [numpy.ndarray, (H,W), numpy.float32]depth imagecamera: [CameraInfo]camera intrinsicsorganized: boolwhether to keep the cloud in image shape (H,W,3)Output:cloud: [numpy.ndarray, (H,W,3)/(H*W,3), numpy.float32]generated cloud, (H,W,3) for organized=True, (H*W,3) for organized=False"""assert(depth.shape[0] == camera.height and depth.shape[1] == camera.width)xmap = np.arange(camera.width)ymap = np.arange(camera.height)xmap, ymap = np.meshgrid(xmap, ymap)points_z = depth / camera.scalepoints_x = (xmap - camera.cx) * points_z / camera.fxpoints_y = (ymap - camera.cy) * points_z / camera.fycloud = np.stack([points_x, points_y, points_z], axis=-1)if not organized:cloud = cloud.reshape([-1, 3])return cloudif mapped_depth is not None:mapped_depth = mapped_depth.astype(float) / 1000.0depth_img = depth_img.astype(float) / 1000.0mask_cloud = create_point_cloud_from_depth_image(mapped_depth, camera, organized=True)depth_range = [0.0, 1.5]mask = (depth_img < depth_range[1]) & (depth_img > depth_range[0])obj_cloud_masked = mask_cloud[mask]rgb_masked = color_img[mask] / 255idxs = np.random.choice(len(cloud_masked), 20000, replace=True)obj_cloud_sampled = obj_cloud_masked[idxs]rgb_sampled = rgb_masked[idxs]pcd.points = o3d.utility.Vector3dVector(obj_cloud_sampled.astype(np.float32))pcd.colors = o3d.utility.Vector3dVector(rgb_sampled.astype(np.float32))# 如果可视化的点云方向不正,可进行坐标系方向调整# obj_cloud_sampled[:, 1] = - obj_cloud_sampled[:, 1]# obj_cloud_sampled[:, 2] = - obj_cloud_sampled[:, 2]o3d.visualization.draw_geometries([pcd])

5、 抓取

如果相对整个场景进行感知抓取,而非指定单个物体,就可以把根据物体mask扣取深度图部分取消。进而,使用开源GraspNet、AnyGrasp等抓取网络进行抓取姿势预测。
在这里插入图片描述

这篇关于D435相机结合Yolo V8识别出目标物体,并转点云出抓取位姿。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033655

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

PHP抓取网站图片脚本

方法一: <?phpheader("Content-type:image/jpeg"); class download_image{function read_url($str) { $file=fopen($str,"r");$result = ''; while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); re

Go 语言中Select与for结合使用break

func test(){i := 0for {select {case <-time.After(time.Second * time.Duration(2)):i++if i == 5{fmt.Println("break now")break }fmt.Println("inside the select: ")}fmt.Println("inside the for: ")}} 执行后

Clion不识别C代码或者无法跳转C语言项目怎么办?

如果是中文会显示: 此时只需要右击项目,或者你的源代码目录,将这个项目或者源码目录标记为项目源和头文件即可。 英文如下:

海鸥相机存储卡格式化如何恢复数据

在摄影的世界里,‌每一张照片都承载着独特的记忆与故事。‌然而,‌当我们不慎将海鸥相机的存储卡格式化后,‌那些珍贵的瞬间似乎瞬间消逝,‌让人心急如焚。‌但请不要绝望,‌数据恢复并非遥不可及。‌本文将详细介绍在海鸥相机存储卡格式化后,‌如何高效地恢复丢失的数据,‌帮助您重新找回那些宝贵的记忆。‌ 图片来源于网络,如有侵权请告知 一、‌回忆备份情况 ‌海鸥相机存储卡格式化如何恢复数据?在意

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

[数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4040 标注数量(xml文件个数):4040 标注数量(txt文件个数):4040 标注类别数:9 标注类别名称:["acalcerosis","fertilizer","flower","fruit","grey