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等抓取网络进行抓取姿势预测。
在这里插入图片描述

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

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

相关文章

从高海拔到严寒季的测量作业更要「快准稳」,怎么实现?

西藏那曲海拔4500米公路勘测项目赶工期 “必须要保障在西藏那曲地区承接的公路勘测项目赶工期需求&#xff0c;海拔高达4500米、网络通讯不足、部分范围存在无网以及地基信号覆盖可能不足的情况&#xff0c;需要能满足环境和项目需求的专业RTK设备紧急送到。” 客户的一个电话…

做外贸是否需要代运营?

相信很多做外贸的小伙伴或者公司都有这样的一个困扰&#xff0c;尤其是做SEO以及平台的公司&#xff0c;会很纠结要不要将公司的运营承包出去。 而之所以有这样的困扰&#xff0c;一部分是公司的业务员可能并不擅长运营&#xff0c;或者是业务员抽不出时间去管理运营这块。 而…

映射网络驱动器自动断开的解决方法

如果将驱动器映射到网络共享&#xff0c;映射的驱动器可能会在定期处于非活动状态后断开连接&#xff0c;并且 Windows 资源管理器可能会在映射驱动器的图标上显示红色 X。&#xff0c;出现此行为的原因是&#xff0c;系统可以在指定的超时期限后断开空闲连接&#xff0c; (默认…

PWA缓存策略区别NetworkOnly/CacheFirst/CacheOnly/NetworkFirst/StaleWhileRevalidate

现在来看看 Workbox 提供的缓存策略&#xff0c;主要有这几种&#xff1a; cache-first, cache-only, network-first, network-only, stale-while-revalidate 在前面看到&#xff0c;实例化的时候会给 workbox 挂载一个 Strategies 的实例。提供上面一系列的缓存策略&…

半导体制造中的压缩气体及其高压扩散器如何选择 北京中邦兴业

了解高压扩散器 高压扩散器&#xff08;HPD&#xff09;对于保持压缩气体样品中颗粒计数的精度至关重要。它们充当颗粒计数器和压缩气体管线之间的纽带&#xff0c;在气体进入颗粒计数器的样品入口时使其扩散。这确保了压力得到控制&#xff0c;以防止对颗粒计数器样品室的敏感…

uniapp学习(001 前期介绍)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第1p-第p10的内容 简介 目录结构 效果 打包成小程序 配置开发者工具 打开安全按钮 使用uniapp的内置组件…

3DMAX一键虚线图形插件DashedShape使用方法

3DMAX一键虚线图形插件使用方法 3dMax一键虚线图形插件&#xff0c;允许从场景中拾取的样条线创建虚线形状。该工具使你能够创建完全自定义的填充图案&#xff0c;为线段设置不同的材质ID&#xff0c;并在视口中进行方便的预览。 【版本要求】 3dMax 2012 – 2025&#xff08;…

数据结构与算法笔记:基础篇 - 数组:为什么数组都是从0开始编号

概述 提到数组&#xff0c;大家应该都不陌生。每一种编程语言基本都会有数组这种数据类型。不过&#xff0c;它不仅仅是一种编程语言中的数据类型&#xff0c;还是一种基础的数据结构。尽管数组看起来非常简单&#xff0c;但是我估计很多人并没有理解这个数据结构的精髓。 在…

AB测试实战

AB测试实战 1、AB测试介绍&#x1f43e; 很多网站/APP的首页都会挂一张头图(Banner)&#xff0c;用来展示重要信息&#xff0c;头图是否吸引人会对公司的营收带来重大影响&#xff0c;一家寿险公司Humana设计了如下三张头图&#xff0c;现在需要决定使用哪一张放到首页&#x…

FastDFS分布式文件系统

一、概述 FastDFS是一款由国人余庆开发的轻量级开源分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括&#xff1a;文件存储、文件同步、文件访问&#xff08;文件上传、文件下载&#xff09;等&#xff0c;主要解决大容量文件存储和高并发访问问题&#xff0c…

jenkins应用2-freestyle-job

1.jenkins应用 1.jenkins构建的流程 1.使用git参数化构建&#xff0c;用标签区分版本 2.git 拉取gitlab远程仓库代码 3.maven打包项目 4.sonarqube经行代码质量检测 5.自定义制作镜像发送到远程仓库harbor 6.在远程服务器上拉取代码启动容器 这个是构建的整个过程和步骤…

保姆级教程:Redis 主从复制原理及集群搭建

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

线程池的工作原理

文章目录 一、应用场景二、工作原理三、主要函数 一、应用场景 传统并发变成的缺陷&#xff1a; 1.创建和销毁线程上花费的时间和消耗的系统资源&#xff0c;甚至可能要比花在处理实际的用户请求的时间和资源要多得多 2. 活动的线程需要消耗系统资源&#xff0c;如果启动太多&…

26、matlab多项式曲线拟合:polyfit ()函数

1、polyfit 多项式曲线拟合 语法 语法&#xff1a;p polyfit(x,y,n) 返回次数为 n 的多项式 p(x) 的系数&#xff0c;该阶数是 y 中数据的最佳拟合&#xff08;基于最小二乘指标&#xff09;。 语法&#xff1a;[p,S] polyfit(x,y,n) 还返回一个结构体 S 语法&#xff1a;[…

优化 mac 储存空间的方法 只需一招为你的苹果电脑提速

在职场中&#xff0c;许多人都对苹果电脑情有独钟。苹果电脑以其简洁美观的设计、流畅稳定的性能以及出色的用户体验&#xff0c;成为了众多职场人士的得力助手。无论是处理文档、制作演示文稿&#xff0c;还是进行创意设计等工作&#xff0c;苹果电脑都能展现出其独特的优势&a…

微信小程序公众号二合一分销商城源码系统 基于PHP+MySQL组合开发的 可多商户商家入驻 带完整的安装代码包以及搭建教程

系统概述 微信小程序公众号二合一分销商城源码系统&#xff0c;是基于PHPMySQL组合开发的一款高效、稳定的电子商务平台解决方案。该系统创新性地将微信公众号与小程序的功能进行了深度整合&#xff0c;为商家提供了一个功能齐全、易于管理的分销商城系统。通过此系统&#xf…

Vue3+vant 带你实现常见的历史记录的业务功能

前言 大部分小伙伴不管是开发PC端还是H5移动端&#xff0c;都会遇到历史搜索的功能。对用户的历史记录进行增删查可以是接口&#xff0c;也可以是前端用缓存实现&#xff0c;一般用浏览器缓存实现的比较多&#xff0c;这篇文章就来教你如何用LocalStorage对历史记录数据的存储、…

视创云展元宇宙虚拟展厅,带来沉浸式的逛展体验!

近年来&#xff0c;随着科技的飞速发展和市场需求的不断演变&#xff0c;众多企业纷纷将目光转向线上虚拟展厅的建设。视创云展元宇宙虚拟展厅凭借其创新性和实用性&#xff0c;为众多企业带来了前所未有的宣传体验&#xff0c;成为了商企展示自我、推广产品的全新舞台。 与传统…

Java 生成SSL证书

第一步&#xff1a; cmd打开指令窗口 第二步&#xff1a; 运行指令&#xff1a; keytool -keystore hk.jks -storepass 123456 -deststoretype jks -genkeypair -keyalg RSA -validity 365 -alias contrastserver -dname "CN111.230.63.59, OUHK, OHK, LZH, STGD, CCN&…

XSKY对象存储深度结合Alluxio分布式缓存系统,GPU利用率提高至90%以上

近日&#xff0c;Alluxio分布式缓存系统完成了与XSKY星辰天合的 XEOS V6.4 对象存储的兼容性测试&#xff0c;旨在解决数据管理和加速方面的挑战。双方进行了深度的产品对接和联合开发&#xff0c;将 Alluxio 分布式缓存系统与 XEOS 对象存储的众多应用特性进行结合&#xff0c…