Intel RealSense D435i深度相机通过点云获取图片中任意点三维信息(python实现)

这篇具有很好参考价值的文章主要介绍了Intel RealSense D435i深度相机通过点云获取图片中任意点三维信息(python实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 引用基础包

import pyrealsense2 as rs
import numpy as np
import cv2
import os
import time
  • 声明了个类,以后也许会添加重置旋转等操作,目前只用了暂停

class State:
    def __init__(self, *args, **kwargs):
        self.WIN_NAME = 'RealSense'
        self.paused = False

state = State()
saved_count = 0
  • 一些相机的基础设置

# 设置
pipeline = rs.pipeline()
config = rs.config()

pipeline_wrapper = rs.pipeline_wrapper(pipeline)
pipeline_profile = config.resolve(pipeline_wrapper)
device = pipeline_profile.get_device()

found_rgb = False
for s in device.sensors:
    if s.get_info(rs.camera_info.name) == 'RGB Camera':
        found_rgb = True
        break
if not found_rgb:
    print("The demo requires Depth camera with Color sensor")
    exit(0)

config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30)

# config.enable_stream(rs.stream.depth, 848, 480, rs.format.z16, 30)
# config.enable_stream(rs.stream.color, 848, 480, rs.format.bgr8, 30)

pipeline.start(config)

# 声明点云对象
pc = rs.pointcloud()
points = rs.points()

# 创建对齐对象与color流对齐
align_to = rs.stream.color 
align = rs.align(align_to)

cv2.namedWindow("live", cv2.WINDOW_AUTOSIZE)
  • 定义保存路径

# 保存路径
f_path = r".\test\test3"
if not os.path.exists(f_path):
    os.mkdir(f_path)
    os.mkdir(os.path.join(f_path, "images"))
    os.mkdir(os.path.join(f_path, "information"))
    os.mkdir(os.path.join(f_path, "live_record"))

save_path = os.path.join(os.getcwd(), f_path + "\live_record", time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()))
os.mkdir(save_path)
os.mkdir(os.path.join(save_path, "color"))
os.mkdir(os.path.join(save_path, "depth"))
  • 获取对齐的图像帧和相机内参 

def get_aligned_images():
    frames = pipeline.wait_for_frames()  # 等待获取图像帧,获取颜色和深度的框架集
    aligned_frames = align.process(frames)  # 获取对齐帧,将深度框与颜色框对齐

    aligned_depth_frame = aligned_frames.get_depth_frame()  # 获取对齐帧中的的depth帧
    aligned_color_frame = aligned_frames.get_color_frame()  # 获取对齐帧中的的color帧

    # 将images转为numpy arrays
    img_color = np.asanyarray(aligned_color_frame.get_data())  # RGB图
    img_depth = np.asanyarray(aligned_depth_frame.get_data())  # 深度图

    # 获取相机参数
    depth_intrin = aligned_depth_frame.profile.as_video_stream_profile().intrinsics  # 获取深度参数(像素坐标系转相机坐标系会用到)
    color_intrin = aligned_color_frame.profile.as_video_stream_profile().intrinsics  # 获取相机内参

    depth_mapped_image = cv2.applyColorMap(cv2.convertScaleAbs(img_depth, alpha=0.03), cv2.COLORMAP_JET)

    return color_intrin, depth_intrin, img_color, img_depth, depth_mapped_image, aligned_color_frame, aligned_depth_frame
  •  获取三维坐标

def get_3d_camera_coordinate(depth_pixel, aligned_color_frame, aligned_depth_frame):
    x = int(depth_pixel[0])
    y = int(depth_pixel[1])
    # 计算点云
    pc.map_to(aligned_color_frame)
    points = pc.calculate(aligned_depth_frame)
    vtx = np.asanyarray(points.get_vertices())
    # print('vtx_before_reshape: ', vtx.shape)  # 921600
    vtx = np.reshape(vtx, (720, 1280, -1))
    # print('vtx_after_reshape: ', vtx.shape)  # (720, 1280, 1)

    camera_coordinate = vtx[y][x][0]
    # print ('camera_coordinate: ',camera_coordinate)
    dis = camera_coordinate[2]
    return dis, camera_coordinate
  • 主函数

if __name__ == "__main__":
    while True:
        if not state.paused:
            # 获取对齐图像帧与相机参数
            color_intrin, depth_intrin, img_color, img_depth, depth_mapped_image, aligned_color_frame, aligned_depth_frame = get_aligned_images()  # 获取对齐图像与相机参数

        # 显示画面
        cv2.imshow("live", np.hstack((img_color, depth_mapped_image)))

        key = cv2.waitKey(1)

此时效果(左侧RGB图,右侧深度图)(过近时深度信息几乎显示不出来)

Intel RealSense D435i深度相机通过点云获取图片中任意点三维信息(python实现)

  •  按下p键暂停画面

        if key == ord("p"):
            state.paused ^= True
  • 按下s键保存图片

        if key == ord("s"):
            saved_color_image = img_color
            saved_depth_mapped_image = depth_mapped_image

            cv2.imwrite(os.path.join((save_path), "color", "{}.jpg".format(saved_count)), saved_color_image)
            cv2.imwrite(f_path + r"\images\target.jpg", saved_color_image)
            np.save(os.path.join((save_path), "depth", "{}".format(saved_count)), img_depth)
            saved_count += 1
  • 按下r键读取刚才保存的图片,并通过image_sliced文件将图片裁剪到自己需要的范围

        if key == ord("r"):
            color_image = cv2.imread(f_path + r"\images\target.jpg")
            cv2.imshow("color", color_image)
            img_sliced = image_sliced.img_sliced(f_path)
            cv2.imshow("img_sliced", img_sliced)

image_sliced.py

import cv2
import os

def img_sliced(f_path):
    image_full = cv2.imread(f_path + r"\images\target.jpg")
    size = image_full.shape
    print('原尺寸=', size)
    target_sliced = image_full[80:370, 309:625]
    print('裁剪后=', target_sliced.shape)
    save_path = os.path.join(f_path + r"\images\target_sliced.jpg")
    cv2.imwrite(save_path, target_sliced)
    # cv2.imshow('image_full', image_full)
    # cv2.imshow('target_sliced', target_sliced)
    # cv2.waitKey(0)
    return target_sliced

# img_sliced(r'.\test\test3')
  • 按下g键进行图像处理,判断方向,并将三维信息显示在图片上

        if key == ord("g"):
            image_processing.main(f_path)
            img_rect = cv2.imread(f_path + r".\images\target_rect_1.jpg")

image_processing.py处理过程参考文章:用python和opencv实现物体框选并保存坐标信息及面积信息(附代码)

调用方向判断文件判断方向并获取物体中心点(x,y)坐标

direction_func.py参考:使用opencv判断物体方向

            cenx, ceny = direction_func.main(f_path)
            print("cenx,ceny", cenx, ceny)
            depth_pixel = [ceny, cenx]

调用获取三维坐标函数计算深度信息并标在图片上

            dis, camera_coordinate = get_3d_camera_coordinate(depth_pixel, aligned_color_frame, aligned_depth_frame)
            print('depth: ', dis)  # 深度单位是m
            print('camera_coordinate: ', camera_coordinate)

            img_rect_direction = cv2.imread(f_path + r".\images\target_rect_direction.jpg")
            # 在图中标记物体中心点及其坐标
            cv2.circle(img_rect_direction, (int(cenx), int(ceny)), 8, [255, 0, 255], thickness=-1)
            cv2.putText(img_rect_direction, "Dis:" + str(dis) + " m", (40, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, [0, 0, 255])
            cv2.putText(img_rect_direction, "X:" + str(camera_coordinate[0]) + " m", (80, 80), cv2.FONT_HERSHEY_SIMPLEX, 1.2, [255, 0, 0])
            cv2.putText(img_rect_direction, "Y:" + str(camera_coordinate[1]) + " m", (80, 120), cv2.FONT_HERSHEY_SIMPLEX, 1.2, [255, 0, 0])
            cv2.putText(img_rect_direction, "Z:" + str(camera_coordinate[2]) + " m", (80, 160), cv2.FONT_HERSHEY_SIMPLEX, 1.2, [255, 0, 0])
            cv2.imshow('xyz', img_rect_direction)

效果:

Intel RealSense D435i深度相机通过点云获取图片中任意点三维信息(python实现)文章来源地址https://www.toymoban.com/news/detail-403222.html

  • 按下q键关闭所有窗口

        if key & 0xFF == ord('q') or key == 27:
            cv2.destroyAllWindows()
            break

结束

pipeline.stop()

到了这里,关于Intel RealSense D435i深度相机通过点云获取图片中任意点三维信息(python实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • realsense D435i 实现外部时钟触发硬件同步多相机数据采集

    最近有一个调试D435i相机的工作,需要使得三个相机能够完成硬件触发的同步,具体来说,就是有一个固定频率的外部脉冲信号,使得三个相机能够根据外部脉冲信号的硬件触发完成双目图片、深度图片、彩色图片、IMU数据的实时响应采集,因为外部脉冲信号是通过一个精确

    2024年01月16日
    浏览(32)
  • 【深度相机D435i】Windows+Ubuntu下调用D435i利用Python读取、保存RGB、Depth图片

    最近组里面的项目需要用到D435i深度相机采集深度图片,所以记录一下在Windows+Ubuntu的环境下使用D435i深度相机的流程,以及如何利用python读取、保存常见的RGB、Depth图片。 D435i 在小巧外形中采用英特尔模块和视觉处理器,是一个功能强大的一体产品,可与可定制软件配合使用

    2024年02月02日
    浏览(27)
  • 项目设计:YOLOv5目标检测+机构光相机(intel d455和d435i)测距

    1.1  Intel D455 Intel D455 是一款基于结构光(Structured Light)技术的深度相机。 与ToF相机不同,结构光相机使用另一种方法来获取物体的深度信息。它通过投射可视光谱中的红外结构光图案,然后从被拍摄物体表面反射回来的图案重建出其三维形状和深度信息。 Intel D455 深度相机

    2024年02月08日
    浏览(35)
  • ubuntu18.04安装Realsense D435i相机SDK及realsense-ros记录,为后期运行yolo v5作准备

    写在前面 :一定要注意各个版本之间的匹配问题,否则会报各种错误。 例如ROS版本和librealsense SDK版本之间的对应关系,以及realsense-ros(Wrapper)与librealsense SDK之间的对应关系 。 系统:ubuntu18.04 ros: melodic 附上Intel® RealSense github网站: https://github.com/IntelRealSense 以及安装教程

    2024年02月05日
    浏览(39)
  • python实现d435i深度相机测量两点之间的距离

    本文介绍python方法实现intel公司realsense系列d435i深度相机测量彩色图像上两点之间的距离。 原理很简单,就是将相机获得的彩色图像流与深度流对齐,这样彩色图像上的每个像素就会对应一个深度值,作为z坐标,然后通过相机内参获得该像素的x坐标和y坐标。我们获得的x、

    2024年02月16日
    浏览(26)
  • 【D435i深度相机YOLO V5结合实现目标检测】

    参考:Ubutntu下使用realsense d435i(三):使用yolo v5测量目标物中心点三维坐标 欢迎大家阅读2345VOR的博客【D435i深度相机YOLO V5结合实现目标检测】🥳🥳🥳 2345VOR鹏鹏主页: 已获得CSDN《嵌入式领域优质创作者》称号👻👻👻,座右铭:脚踏实地,仰望星空🛹🛹🛹 本文章属于

    2024年02月08日
    浏览(44)
  • Realsense d435i驱动安装、配置及校准

    写在前面 本文是在ubuntu20.04下安装,其它版本大同小异。可能出现的问题,主要由各自安装相关库版本不一致导致,故问题不一,但一般很好解决,正常情况下不会出现。 Intel Realsense 深度摄像头D435i将D435强大的深度感知能力和惯性测量单元(IMU)结合起来,可满足RGBD、单目、

    2024年02月02日
    浏览(36)
  • Realsense D435i Yolov5目标检测实时获得目标三维位置信息

    - Colorimage: - Colorimage and depthimage: 1.一个可以运行YOLOv5的python环境 2.一个realsense相机和pyrealsense2库 在下面两个环境中测试成功 win10 python 3.8 Pytorch 1.10.2+gpu CUDA 11.3 NVIDIA GeForce MX150 ubuntu16.04 python 3.6 Pytorch 1.7.1+cpu 修改模型配置文件,以yolov5s为例。 如果使用自己训练的模型,需要进

    2024年02月04日
    浏览(42)
  • d435i 相机和imu标定

    使用 imu_utils 功能包标定 IMU,由于imu_utils功能包的编译依赖于code_utils,需要先编译code_utils,主要参考 相机与IMU联合标定_熊猫飞天的博客-CSDN博客 Ubuntu20.04编译并运行imu_utils,并且标定IMU_学无止境的小龟的博客-CSDN博客 1.1 编译 code_utils 创建工作空间 1.1.1 修改 CMakeLists.txt 文件

    2024年02月09日
    浏览(43)
  • 【完整教程】在win10平台下使用d435i深度相机读取数据并保存到本地,以便进行后续3D点云处理

    进入网址:RealSense SDK 2.0 直接拉到网站最下端,在Asset下可以看到很多exe可执行软件,由于我的电脑是win10,所以选择第三个。说句题外话,鄙人曾经考英语六级时记得Asset专门指不动资产,没错,就是房子! 下载完成后文件夹内有如下图所示软件,直接安装即可。 安装完成

    2024年02月02日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包