【Lidar】基于Python格网法计算点云体积(eg.树木体积)

        这两天一直不在状态,不是特别想分享文章,所以也没怎么更新。但是代码放在文件里始终不是它的归宿,只有被不断使用它才能进步,才能诠释它的意义。所以今天抽空给大家分享一下如何基于Python利用格网法计算点云的体积,我这里是做林业的点云,所以是按照树木体积编写的代码。

1 代码逻辑

        逻辑部分其实很简单,就是将三维点云数据投影至二维平面,再通过格网将二维平面切割成无数个小块,统计位于该格网中点云的最高点和最低点差值,用这个高度差值乘以格网大小,即这个格网的体积,再将所有格网体积累加即该物体的体积。类似于积分学,将无数个格网体积近似等同于物体的体积。

2 完整代码

        这里就不过多解释了,有注释!原理上面已经说明白了。

# -*- coding: utf-8 -*-
"""
@Time : 2023/9/3 14:37
@Auth : RS迷途小书童
@File :Grid method for volume calculation.py
@IDE :PyCharm
@Purpose:格网法计算点云体积并展示刨面图
"""
import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap


def grid_method(point_cloud, grid_size):
    points = np.asarray(point_cloud.points)
    # 将点云数据转换为数组
    points_x = points[:, 0]  # 获取x的数组
    points_y = points[:, 1]  # 获取y的数组
    cols_x = int(np.ceil((np.max(points_x) - np.min(points_x)) / grid_size))+1  # 计算栅格的列数
    cols_y = int(np.ceil((np.max(points_y) - np.min(points_y)) / grid_size))+1  # 计算栅格的行数
    start_x = np.min(points_x)  # 获取x的最小值作为格网的起始x
    start_y = np.min(points_y)  # 获取y的最小值作为格网的起始y
    result = 0  # 初始化体积为0
    array_show = np.zeros((cols_x, cols_y))  # 创建用来显示的数组
    for col_x in range(0, cols_x):  # 遍历格网的列
        end_x = np.min(points_x) + grid_size * (col_x+1)
        # 获取当前格网的范围
        for col_y in range(0, cols_y):  # 遍历格网的行
            end_y = np.min(points_y) + grid_size * (col_y+1)
            # 获取当前格网的范围
            mask = (points[:, 0] >= start_x) & (points[:, 0] <= end_x) & (points[:, 1] >= start_y) & (points[:, 1] <= end_y)
            # 通过格网范围筛选出落在当前网格内的点
            if np.sum(mask) > 0:
                # 如果当前网格内有点,则记录最大高度
                max_z = np.max(points[mask, 2])
                min_z = np.min(points[mask, 2])
                height = max_z - min_z  # 计算格网内的高度插差值
                # print("Max_z:",max_z)
                # print("Min_z:",min_z)
                # print("Height:",height)
                if height <= 0.0005:
                    # 记录高度差非常小的格网,原因:格网范围过小,最高点和最低点没有落在格网内
                    print("当前起始点:", start_x, start_y)
                    print("当前终止点:", end_x, end_y)
                    print("当前格网内的点云为:")
                    print(np.array([points[mask, 0], points[mask, 1], points[mask, 2]]))
                result += height * grid_size ** 2  # 将格网的体积累加
                array_show[col_x, col_y] = height
            start_y = end_y
        start_x = end_x
    return result, array_show


if __name__ == "__main__":
    pcd_path = "彭俊喜/1 - Cloud.pcd"  # 读取点云文件
    pcd = o3d.io.read_point_cloud(pcd_path)
    Grid_size = 0.1  # 设置栅格大小(根据实际情况调整)
    volume, array = grid_method(pcd, Grid_size)  # 计算树冠体积
    print("树冠体积:", volume)
    fig, ax = plt.subplots()  # 创建图形和轴对象
    cmap = LinearSegmentedColormap.from_list('white_to_red', ['white', (0.8, 0.5, 0.2), 'yellow', 'green'])
    im = ax.imshow(array, cmap=cmap)  # 绘制图像'coolwarm'
    cbar = fig.colorbar(im, ax=ax, orientation='vertical')  # 添加颜色拉伸的图例
    cbar.set_label('Colorbar Label')
    plt.savefig(r"G:\Anaconda\ProjectYOLO\yolov5-7.0\Point Cloud/1.png")  # 将图形窗口中的内容保存到指定的路径
    plt.show()  # 显示图形
    

3 效果展示

4 总结

        对于点云数据体积的计算,格网法是个不错的选择。但是要注意格网大小的选择,如果过大可能导致体积拟合大于实际值过多。如果过小,可能很多格网都在点云的缝隙之间,这就会导致拟合的体积过小。

        大家如果对点云数据的处理感兴趣可以随时留言交流。如果觉得博主的文章对你有帮助,可以给我点个赞,加个关注,我后面会更新更多点云数据处理的教程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring+SpringMVC+SpringBoot

Spring bean bean基础配置 bean别名配置 注意事项&#xff1a; 获取bean无论是通过id还是name获取。如果无法获取到&#xff0c;将抛出异常NoSuchBeanDefinitionException bean的作用范围配置 适合交给容器进行管理的bean 表现层对象、业务层对象、数据层对象、工具对象 不…

jmeter调试错误全集(入门必备)

一、前言 在使用jmeter做接口测试的过程中大家是不是经常会遇到很多问题&#xff0c;但是无从下手&#xff0c;不知道从哪里开始找起&#xff0c;对于初学者而言这是一个非常头痛的事情。这里结合笔者的经验&#xff0c;总结出以下方法。 二、通过查看运行日志调试问题 写好脚…

UE4/UE5 日志插件(基于spdlog)

1 解决问题 对于高频日志序列化到本地的需求&#xff0c;spdlog肯定完美满足。 源码地址&#xff1a;https://github.com/gabime/spdlog 博主下载的版本为 spdlog-1.12.0&#xff0c;各位大佬可以根绝自己爱好选择。 2 过程介绍 大概目录&#xff1a; SpdlogLibC目录下是对…

WGAN 优势小结

我在上一篇博文为什么 GAN 不好训练中&#xff0c;分析了原始 GAN 难以训练的原因&#xff0c;本篇博文将分析下 WGAN 的优势。 1. Wasserstein 距离 W 是指 Wasserstein&#xff0c;Wasserstein 距离又叫Earth-Mover&#xff08;EM&#xff09;距离。Wasserstein距离相比KL散…

2024年企业和个人都在备考的权威性 AI人工智能工程师培训类证书

给大家推荐个2024年企业和个人都在备考的权威性 AI人工智能工程师培训类证书&#xff0c;看能否帮到大家的&#xff1a; 由工业和信息化部电子工业标准化研究院颁发的关于以下两类证书&#xff1a; 计算机自然语言及语音处理设计开发工程师&#xff08;中级&#xff09; 计算机…

软件设计师——信息安全(二)

&#x1f4d1;前言 本文主要是【信息安全】——软件设计师——信息安全的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

【无数次任意地址读+栈溢出】ImaginaryCTF2023 -- opportunity

前言 本题不难&#xff0c;但感觉笔者的做法挺有意思&#xff08;嘿嘿&#xff0c;自夸啦&#xff09;&#xff0c;利用到了最近学到的 ret2hbp。 漏洞分析 保护&#xff1a;smap 等都开了&#xff0c;标配啦 >_< 漏洞是直给的&#xff1a;这里存在一个 256 字节的任…

阅读代码的记录

1-utils_metrics.py用在train.py中做指标衡量&#xff0c;现在想在推理&#xff08;predict.py&#xff09;的时候衡量一下指标 2-调研眼睛部位的单独分割。 https://blog.csdn.net/qq_40234695/article/details/88633094 衡量图像语义分割准确率主要有三种方法&#xff1a; …

高级C#技术(二)

前言 本章为高级C#技术的第二节也是最后一节。前一节在下面这个链接 高级C#技术https://blog.csdn.net/qq_71897293/article/details/134930989?spm1001.2014.3001.5501 匿名类型 匿名类型如其名&#xff0c;匿名的没有指定变量的具体类型。 举个例子&#xff1a; 1 创建…

YOLOv8改进《目标对象计数》多任务实验:深度集成版来了!支持自定义数据集训练自定义模型

💡该教程为改进YOLO专栏,属于《芒果书》📚系列,包含大量的原创改进方式🚀 💡🚀🚀🚀内含改进源代码 按步骤操作运行改进后的代码即可💡更方便的统计更多实验数据,方便写作 YOLOv8改进《目标对象计数》多任务实验:深度集成版来了!支持自定义数据集训练自定…

匿名内部类与Lambda表达式

深入了解Java的匿名内部类 Java作为一种面向对象的编程语言&#xff0c;提供了许多灵活的特性&#xff0c;其中之一就是匿名内部类。匿名内部类是一种没有名字的局部内部类&#xff0c;通常用于创建只需在一个地方使用的类的实例。 什么是匿名内部类&#xff1f; 匿名内部类是…

学习Java第70天,过滤器Filter简介

过滤器概述 Filter,即过滤器,是JAVAEE技术规范之一,作用目标资源的请求进行过滤的一套技术规范,是Java Web项目中最为实用的技术之一 Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口 Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest和…

Unity2023.3(Unity6)版本开始将可以发布WebGPU

翻译一段官网上的话&#xff1a; 利用Unity 2023.3(正式发布时应该称为Unity6)中最新的WebGPU图形API集成&#xff0c;尝试最大限度的提升您的网络游戏的真实感。 通过与谷歌的战略合作&#xff0c;Unity实时3D平台的强大的图形功能现在为图形丰富的网络游戏进行微调&#xff0…

知识库SEO:提升网站内容质量与搜索引擎排名的策略

随着搜索引擎算法的不断更新和优化&#xff0c;单纯依靠关键词堆砌和外部链接的时代已经过去。现在的SEO&#xff08;搜索引擎优化&#xff09;已经转向了以提供高质量、有价值内容为核心的阶段。知识库SEO便是这个新阶段的重要策略之一。 | 一、知识库SEO的概念与意义 1.定义…

python 新手学习 - 简单实用的 Python 周期任务调度工具

如果你想周期性地执行某个 Python 脚本&#xff0c;最出名的选择应该是 Crontab 脚本&#xff0c;但是 Crontab 具有以下缺点&#xff1a; 1.不方便执行秒级任务。 2.当需要执行的定时任务有上百个的时候&#xff0c;Crontab 的管理就会特别不方便。 还有一个选择是 Celery&a…

text-align-last: justify 使用方法,对齐字段交互

<html> <style>.label {display: inline-block;width: 100px;text-align-last: justify;} </style><body><div class"l-content"><div><div class"label">身份证&#xff1a;</div><div class"la…

DDA 算法

CAD 算法是计算机辅助设计的算法&#xff0c;几何算法是解决几何问题的算法 CAD 算法是指在计算机辅助设计软件中使用的算法&#xff0c;用于实现各种设计和绘图功能&#xff0c;CAD 广泛应用于建筑、机械、电子等领域&#xff0c;可以大大提高设计效率和精度 绘图算法是 CAD…

RLC防孤岛负载测试:电力系统安全运行的重要保障

在电力系统中&#xff0c;孤岛效应是一个严重的问题&#xff0c;它可能导致电力系统的不稳定甚至崩溃。为了确保电力系统的安全运行&#xff0c;必须进行RLC防孤岛负载测试。RLC防孤岛负载测试是一种模拟电网故障后&#xff0c;对电力系统进行检测的方法&#xff0c;主要用于检…

性格内向,如何找到适合自己的职业

很多人都会觉得性格内向是一件坏事&#xff0c;这会让自己在竞争激烈的生活中得不到好处&#xff0c;但其实在心理学上看来&#xff0c;每一种性格都有自己的优缺点&#xff0c;如果片面地用好坏去评定&#xff0c;就无法发挥性格的优势&#xff0c;也很难利用它们为自己所用。…

LLM(六)| Gemini:谷歌Gemini Pro 开放API ,Gemini Pro 可免费使用

近期&#xff0c;Google Gemini Pro 开放API 了&#xff0c;且Gemini Pro 可免费使用&#xff01;Gemini Pro支持全球180个国家的38种语言&#xff0c;目前接受文本作为输入并生成文本作为输出。 Gemini API 地址&#xff1a;http://ai.google.dev Gemini Pro 的表现超越了其他…
最新文章