深度相机xyz点云文件三维坐标和jpg图像文件二维坐标的相互变换函数

news2024/9/28 21:18:58

深度相机同时拍摄xyz点云文件和jpg图像文件。xyz文件里面包含三维坐标[x,y,z]和jpg图像文件包含二维坐标[x,y],但是不能直接进行变换,需要一定的步骤来推演。
在这里插入图片描述

下面函数是通过box二维框[xmin, ymin, xmax, ymax, _, _ ]去截取xyz文件中对应box里面的点云,返回点云的numpy数组

    def get_point_from_xyz_and_box(self, Image_XYZ_Name, box, p=0.1, Sampling_interval=4):
        #改进的读取点云的函数,可以节省很多时间
        # 使用内存映射读取文件
        with open(Image_XYZ_Name, "rb") as fd:
            # 计算映射大小和偏移
            dtype = np.dtype(np.uint16)
            offset = dtype.itemsize * self.width * self.height * 3  #根据文件格式调整
            fd.seek(0, 2)  # 移动到文件末尾
            file_size = fd.tell()
            assert file_size >= offset, "文件大小不匹配"

            # 创建内存映射
            mm = np.memmap(fd, dtype=dtype, mode='r', shape=(self.height, self.width, 3), order="C")

        # 转换为3D点云,只读取box范围内的
        xmin, ymin, xmax, ymax, _, _ = box
        y_indices = np.arange(ymin, ymax, Sampling_interval, dtype=int)
        x_indices = np.arange(xmin, xmax, Sampling_interval, dtype=int)

        # 构建网格索引
        y_grid, x_grid = np.meshgrid(y_indices, x_indices, indexing='ij')
        depth_points = mm[y_grid, x_grid].reshape(-1, 3) * p
        # print('mm',mm) 
        # print(y_grid, x_grid) 

        # 过滤无效点(假设深度值为0表示无效点)
        valid_points = depth_points[depth_points[:, 2] != 0]
        return valid_points

下面函数是知道点云中的一个点[x,y,z]来计算出这个点对应的二维坐标[y,x]

 def calculate_box_from_points_and_xyz(self, point, p=0.1):
            with open(self.XYZ_Name, "rb") as fd:
            # 计算映射大小和偏移
            dtype = np.dtype(np.uint16)
            offset = dtype.itemsize * self.width * self.height * 3  # 根据文件格式调整
            fd.seek(0, 2)  # 移动到文件末尾
            file_size = fd.tell()
            assert file_size >= offset, "文件大小不匹配"
            # 创建内存映射
            a = np.memmap(fd, dtype=dtype, mode='r', shape=(self.height, self.width, 3), order="C")
            
        # 将所有点的坐标转换为KD树需要的格式,并除以p
        points = np.reshape(a, (-1, 3)) 
        kd_tree = KDTree(points)
        
        # 查找最接近的点
        point_idx = kd_tree.query(point / p)[1]
        
        # 将一维索引转换回二维索引
        matching_indice = np.unravel_index(point_idx, (self.height, self.width))
        return matching_indice

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

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

相关文章

洛谷P5717 三角形分类

给出三条线段a,b,c 的长度,均是不大于 1000010000 的正整数。打算把这三条线段拼成一个三角形,它可以是什么三角形呢? 如果三条线段不能组成一个三角形,输出Not triangle;如果是直角三角形,输出Right tria…

图的简单介绍

定义及术语 G(V,E):图G的顶点集为V,边集为E。分为有向图和无向图两类。 顶点的度:与该结点相连的边的条数。 出度:顶点的出边条数 入度:顶点的入边条数 顶点的权值称为点权,边的权值称为边权。 存储 1.邻…

Day14:信息打点-主机架构蜜罐识别WAF识别端口扫描协议识别服务安全

目录 Web服务器&应用服务器差异性 WAF防火墙&安全防护&识别技术 蜜罐平台&安全防护&识别技术 思维导图 章节知识点 Web:语言/CMS/中间件/数据库/系统/WAF等 系统:操作系统/端口服务/网络环境/防火墙等 应用:APP对象/…

c++基础知识补充6

new相比malloc可以操作自定义类型 开空间的同时调用构造函数初始化 new,delete和malloc,free要分组使用,否则结果不确定 new和delete本质是malloc和free的封装

香港服务器选择指南(挑选香港服务器的几个标准)

​  随着全球化的加速和互联网的普及,跨境访问和外贸活动越来越频繁。在这个背景下,香港服务器作为一种国际化的基础设施,受到了广泛欢迎。本文将探讨企业在选择香港服务器时应关注的几个标准事项。 1.可靠性和正常运行时间 停机可能会给企…

代码随想录算法训练营第46天| Leetcode 139.单词拆分、卡码网 56. 携带矿石资源(附带多重背包的基本解法和优化)

文章目录 Leetcode 139.单词拆分卡码网 56. 携带矿石资源方法一: 分组转化成01背包方法二: 转化成01背包完全背包(基于方法一的小优化)方法三: 二进制优化(优化了方法一的分组方式) Leetcode 13…

基于springboot的宠物咖啡馆平台的设计与实现论文

基于Spring Boot的宠物咖啡馆平台的设计与实现 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于Spring Boot的宠物咖啡馆平台的设计与实现的开发全过程。通过分析基于Spring Boot的宠物咖啡馆平台的设计与…

【Scratch画图100例】图49-scratch绘制直角风车 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例

目录 scratch绘制直角风车 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、实现流程 1、案例分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 …

leetcode第 387 场周赛总结

很久没打周赛了,这周开始恢复 这次周赛,题目比较简单,第三道题有点浪费了时间,思路是对的,但是被我把问题复杂化了。 晚上来写题解和总结

YOLOv9有效提点|加入SGE、Ge、Global Context、GAM等几十种注意力机制(四)

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、本文介绍 本文只有代码及注意力模块简介,YOLOv9中的添加教程:可以看这篇文章。 YOLOv9有效提点|加入SE、CBAM、ECA、SimA…

C++入门全集(3):类与对象【中】

一、前言 经过上一篇文章的学习,我们知道类中由成员变量和成员函数组成 本章的内容,就围绕类的6个默认成员函数展开讲解 如果一个类中什么都没有,简称为空类 class Date {};然而,空类真的像表面一样什么都没有吗?不…

HBM(High Bandwidth Memory)

选择正确的高带宽内存 构建高性能芯片的选择越来越多,但附加内存的选择却几乎没有变化。为了在汽车、消费和超大规模计算中实现最大性能,选择取决于一种或多种 DRAM,而最大的权衡是成本与速度。 尽管多年来人们一直在努力用更快、更便宜或更…

【MySQL】索引(重点)-- 详解

一、索引 没有索引,可能会有什么问题? 索引 :提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调 sql ,只要执行正确的 create index ,查询速度就可能提高成…

06.QT信号和槽-1

一、信号和槽概述 在Qt中,用户和控件的每次交互过程称为一个事件。比如"用户点击按钮"是一个事件,"用户关闭窗口"也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出"按钮被点击"的信号&#xff…

武汉灰京文化:多样化推广与创新引领游戏行业

作为专业的游戏推广服务商,武汉灰京文化注重多样化的推广策略,通过与各大媒体、社交平台和游戏社区建立紧密的合作关系,为游戏企业提供全方位的推广服务。他们通过精确的广告投放、内容创作和社交媒体互动等方式,将游戏信息传播给…

MySQL 核心模块揭秘 | 07 期 | 二阶段提交 (1) prepare 阶段

二阶段提交的 prepare 阶段,binlog 和 InnoDB 各自会有哪些动作? 本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 1. 二阶段提交 二阶段提交,顾名思义,包含两个阶段,它们是: prepare 阶段。…

xxl-job--02--可视化界面各功能详细介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 可视化界面1 新增执行器2.新增任务**执行器**:**任务描述**:**路由策略**:**Cron**:cron表达式**运行模式**JobHandl…

YOLO算法

YOLO介绍 YOLO,全称为You Only Look Once: Unified, Real-Time Object Detection,是一种实时目标检测算法。目标检测是计算机视觉领域的一个重要任务,它不仅需要识别图像中的物体类别,还需要确定它们的位置。与分类任务只关注对…

【Python】进阶学习:pandas--query()用法详解

📚【Python】进阶学习:pandas–query()用法详解 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希…

Docker知识点总结

二、Docker基本命令: Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装,安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker: yum install docker -y -y 表示自动确认…