wannyaky_F 2024-03-18 14:09 采纳率: 60%
浏览 11
已结题

关于open3D点云计算粗糙度的单位问题

#这样计算出的点云Sa=0.0063705,单位是毫米吗根据推测是毫米,但是不知道依据是什么,是不是和原始点云单位一致,原始点云的单位也不知道在哪里看,请问有懂的嘛

import open3d as o3d
import matplotlib.pyplot as plt
from numpy import *
import numpy as np


def roughness_projection(point_list, plane_list):
    sa_list = []
    for i in range(len(plane_list)):
        A, B, C, D = plane_list[i]
        f_a, f_b, f_c, f_d = -A, -B, -C, -D

        x = point_list[i][:, 0]
        y = point_list[i][:, 1]
        z = point_list[i][:, 2]

        distance = []

        xp = []
        yp = []
        zp = []
        for j in range(len(x)):
            xp.append(
                ((f_b ** 2 + f_c ** 2) * x[j] - f_a * (f_b * y[j] + f_c * z[j] + f_d)) / (
                            f_a ** 2 + f_b ** 2 + f_c ** 2))
            yp.append(
                ((f_a ** 2 + f_c ** 2) * y[j] - f_b * (f_a * x[j] + f_c * z[j] + f_d)) / (
                            f_a ** 2 + f_b ** 2 + f_c ** 2))
            zp.append(
                ((f_a ** 2 + f_b ** 2) * z[j] - f_c * (f_a * x[j] + f_b * y[j] + f_d)) / (
                            f_a ** 2 + f_b ** 2 + f_c ** 2))
            distance.append(((x[j] - xp[j]) ** 2 + (y[j] - yp[j]) ** 2 + (z[j] - zp[j]) ** 2) ** (0.5))
        sa = mean(distance)
        sa_list.append(sa)
    return sa_list


def roughness_view(point_list, plane_list):
    fig1 = plt.figure()
    ax1 = fig1.add_subplot(111, projection='3d')
    ax1.set_xlabel("x")
    ax1.set_ylabel("y")
    ax1.set_zlabel("z")

    for i in range(len(plane_list)):
        x = point_list[i][:, 0]
        y = point_list[i][:, 1]
        z = point_list[i][:, 2]
        A, B, C, D = plane_list[i]
        a, b, c, d = A, B, -C, D

        ax1.scatter(x, y, z, color='gray', marker='.')

        x_p = np.linspace(min(x), max(x), 100)
        y_p = np.linspace(min(y), max(y), 100)
        x_p, y_p = np.meshgrid(x_p, y_p)
        z_p = a * x_p + b * y_p + d
        ax1.plot_wireframe(x_p, y_p, z_p, rstride=10, cstride=10)

    plt.show()
    return None


if __name__ == '__main__':
    # 拟合平面:z = 0.559 * x + 0.164 * y + -11.822
    plane_list = [[-0.05081, -0.05180, -1, -35.88367]]
    point_list = []
    pcd = o3d.io.read_point_cloud("6.pcd")
    pcd = np.asarray(pcd.points)
    point_list.append(pcd)

    sa_list = roughness_projection(point_list, plane_list)
    print("sa算术平均粗糙度:", sa_list)
    roughness_view(point_list, plane_list)

img

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-03-18 14:11
    关注

    wannyaky_F 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    根据提供的代码,可以看出点云计算得到的粗糙度单位是原始点云的单位,即毫米。下面是解决方案:

    1. 点云单位的确定:根据代码中的pcd = o3d.io.read_point_cloud("6.pcd")可知,点云数据是从名为"6.pcd"的文件中读取得到的,可以通过查看该文件的文件格式说明或者数据源的文档来确定点云的单位。

    2. 粗糙度的计算:代码中的sa = mean(distance)表示计算的是初始点云中每个点到拟合平面的距离的平均值,得到的粗糙度的单位与初始点云的单位一致。

    3. 单位的转换:如果希望将粗糙度的单位转换为其他单位,可以根据自己的需求进行相应的转换计算。

    修改后的代码如下所示:

    import open3d as o3d
    import matplotlib.pyplot as plt
    import numpy as np
    
    def roughness_projection(point_list, plane_list):
        sa_list = []
        for i in range(len(plane_list)):
            A, B, C, D = plane_list[i]
            f_a, f_b, f_c, f_d = -A, -B, -C, -D
    
            x = point_list[i][:, 0]
            y = point_list[i][:, 1]
            z = point_list[i][:, 2]
    
            distance = []
    
            xp = []
            yp = []
            zp = []
            for j in range(len(x)):
                xp.append(
                    ((f_b ** 2 + f_c ** 2) * x[j] - f_a * (f_b * y[j] + f_c * z[j] + f_d)) / (
                                f_a ** 2 + f_b ** 2 + f_c ** 2))
                yp.append(
                    ((f_a ** 2 + f_c ** 2) * y[j] - f_b * (f_a * x[j] + f_c * z[j] + f_d)) / (
                                f_a ** 2 + f_b ** 2 + f_c ** 2))
                zp.append(
                    ((f_a ** 2 + f_b ** 2) * z[j] - f_c * (f_a * x[j] + f_b * y[j] + f_d)) / (
                                f_a ** 2 + f_b ** 2 + f_c ** 2))
                distance.append(((x[j] - xp[j]) ** 2 + (y[j] - yp[j]) ** 2 + (z[j] - zp[j]) ** 2) ** (0.5))
            sa = np.mean(distance) * 1000  # 转换为毫米
            sa_list.append(sa)
        return sa_list
    
    def roughness_view(point_list, plane_list):
        fig1 = plt.figure()
        ax1 = fig1.add_subplot(111, projection='3d')
        ax1.set_xlabel("x")
        ax1.set_ylabel("y")
        ax1.set_zlabel("z")
    
        for i in range(len(plane_list)):
            x = point_list[i][:, 0]
            y = point_list[i][:, 1]
            z = point_list[i][:, 2]
            A, B, C, D = plane_list[i]
            a, b, c, d = A, B, -C, D
    
            ax1.scatter(x, y, z, color='gray', marker='.')
    
            x_p = np.linspace(min(x), max(x), 100)
            y_p = np.linspace(min(y), max(y), 100)
            x_p, y_p = np.meshgrid(x_p, y_p)
            z_p = a * x_p + b * y_p + d
            ax1.plot_wireframe(x_p, y_p, z_p, rstride=10, cstride=10)
    
        plt.show()
        return None
    
    if __name__ == '__main__':
        # 拟合平面:z = 0.559 * x + 0.164 * y + -11.822
        plane_list = [[-0.05081, -0.05180, -1, -35.88367]]
        point_list = []
        pcd = o3d.io.read_point_cloud("6.pcd")
        pcd = np.asarray(pcd.points)
        point_list.append(pcd)
    
        sa_list = roughness_projection(point_list, plane_list)
        print("sa算术平均粗糙度:", sa_list)
        roughness_view(point_list, plane_list)
    

    修改后的代码将粗糙度的单位转换为毫米,即sa = np.mean(distance) * 1000

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 已采纳回答 3月18日
  • 创建了问题 3月18日