分享好友 最新资讯首页 最新资讯分类 切换频道
获取点云
2024-12-19 17:32

借到了相机d435i。开始尝试获取点云。

获取点云

要求:检测砖垛的第一层,计数并定位,便于之后机器人的操作。这里第一层砖块不是规则排布的。

目的:这篇文章主要记录如何与相机交互,获得点云,还有想办法把不需要的点云删除。

思路:俯拍砖垛。然后在z轴方向设置阈值,已达到删除第一层砖以外的平面的目的。

这里的代码我参考了

    ********************************************************************************************************

    导入必要的库,open3d用于点云的处理和可视化。numpy用于数组的处理。pyrealsense2用于和realsense相机交互。

    import open3d as o3d

    import numpy as np

    import pyrealsense2 as rs

    建立管道并配置深度和彩色流

    #Configure the pipeline to depth and color streams

    pipeline = rs.pipeline()

    config = rs.config()

    config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

    config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

    开始流

    #Start streaming

    pipe_profile = pipeline.start(config)

    建立对齐对象,将深度流向彩色流对齐

    #Create Alignment

    pc = rs.pointcloud()

    align_to_color = rs.align(rs.stream.color)

    try:

    跳过初始的20帧,以便相机稳定下来

        #Skip a few frames

        for _ in range(20):

            pipeline.wait_for_frames()

    获取对齐后的深度和彩色帧

        frames = pipeline.wait_for_frames()

        frames = align_to_color.process(frames)

        depth_frame = frames.get_depth_frame()

        color_frame = frames.get_color_frame()

    将深度帧和彩色帧转换为numpy数组以便后续处理

        # Convert images to numpy arrays

        depth_image = np.asanyarray(depth_frame.get_data())

        color_image = np.asanyarray(color_frame.get_data())

    获取相机的内参,这里用的是pyrealsense2

        # Intrinsics

        profile = frames.get_profile()

        intrinsics = profile.as_video_stream_profile().get_intrinsics()

    这里用的是open3d   

    # 转换为open3d中的相机参数

        pinhole_camera_intrinsic = o3d.camera.PinholeCameraIntrinsic(

            intrinsics.width, intrinsics.height, intrinsics.fx, intrinsics.fy, intrinsics.ppx, intrinsics.ppy)

    从深度图创建点云,得到初始点云

        # Create point cloud from depth image

        depth = o3d.geometry.Image(depth_image)

        pcd = o3d.geometry.PointCloud.create_from_depth_image(depth, pinhole_camera_intrinsic)

        # Visualize initial point cloud

        o3d.visualization.draw_geometries([pcd],window_name="original",

                                          width=1024, height=768,

                                          left=50, top=50,

                                          mesh_show_back_face=False)

       删除第一层以外的平面

       从初始点云获得各个点的坐标,找出z的最小值作为第一层的代表

       这里因为我使用直立的麻将作为模型,高度大约为3cm,用zmin+h/2作为阈值

       保留z值小于阈值的点,即为第一层的点

       创建点云对象level_pcd,将转换后的点云对象赋值给level_pcd的points属性

       保存第一层的点云level_pcd为pcd文件,命名为level_1.pcd

        # Remove second layer

        point_stack = np.asarray(pcd.points)

        z = point_stack[:, 2]

        zmin = np.min(z)

        print('min z', zmin)

        threshold = zmin + 0.015

        level_point = point_stack[z < threshold]

        level_pcd = o3d.geometry.PointCloud()

        level_pcd.points = o3d.utility.Vector3dVector(level_point)

        # Visualize first layer point cloud

        o3d.visualization.draw_geometries([level_pcd], window_name="Level 1",

                                          width=1024, height=768,

                                          left=50, top=50,

                                          mesh_show_back_face=False)

        o3d.io.write_point_cloud("level_1.pcd", level_pcd)

    finally:

        pipeline.stop()

        print('done')

    后面要开始滤波,之后再写吧 

    #Statistical outlier removal

        print("Statistical outlier removal")

        cl, ind = level_pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)

        sor_cloud = level_pcd.select_by_index(ind)

        print("before",level_pcd)

        print("after",sor_cloud)

        # Visualize filtered point cloud

        o3d.visualization.draw_geometries([sor_cloud], window_name="Statistical Filtering",

                                          width=1024, height=768,

                                          left=50, top=50,

                                          mesh_show_back_face=False)

    最新文章
    【增长】机构:预计2024年Mini LED背光产品出货增长至1379万台;天钰:AMOLED驱动芯片将于2024年Q2量产;大尺寸LCD/OLED面板供需情况改善
    1.机构:预计2024年Mini LED背光产品出货增长至1379万台2.天钰:AMOLED驱动芯片将于2024年Q2量产3.京东方终止云南OLED项目10亿元
    2025年百度广告投放最新实战指南
    在数字化营销日益重要的今天,百度广告投放已成为众多企业推广品牌、吸引潜在客户的重要手段。然而,随着市场竞争的加剧,如何高
    SEO优化站长如何提高搜索排名
    在当今竞争激烈的数字市场中,提升网站的搜索排名是每位站长的主要目标。通过有效的SEO策略,不仅可以提高网站的可见性,还能吸
    企业在线竞争力提升——专业SEO推广服务助力突破
    网站优化SEO推广服务,专注于帮助企业提升在线竞争力。通过专业技术和策略,优化网站排名,吸引潜在客户,助力企业拓展市场,实
    全面解析宏碁暗影骑士软件:提升游戏性能的利器
    在现代游戏环境中,电脑性能往往是决定玩家游戏体验的关键因素之一。对于游戏爱好者来说,拥有一款能够有效提升游戏性能的软件是
    SEO优化推广软件,点击精灵(SEO流量软件)是否真有用?
    各位亲爱的小伙伴们,今天小编要和大家一起聊聊关于SEO优化推广软件中的一员——点击精灵(SEO流量软件)。大家都知道,在如今激烈
    SEO排名神器套装全面解析,轻松驾驭网站优化
    全面解析SEO排名工具套装,涵盖关键词分析、网站结构优化、内容质量评估等功能,助您轻松提升网站排名,快速吸引更多流量。无论
    百度网址收录提交入口(百度收录网站链接入口)
    对于国内广大中文博客站长来说,百度搜索仍是绕不开的话题,不被搜索引擎抓取,网友很难找到你的文章,网站的访问量定然高不了。
    【数据结构】顺序表(Sequential List) && 单链表(Singly Linked List )
    01 预备知识1.0 什么是线性表?线性表(List)是零个或者多个数据元素的有限序列.1.1 线性表的基本操作(描述)关于线性表的基本操作