open3d 点云拟合圆 mesh

1、功能介绍:

使用 numpy 和 open3d 进行 二维圆拟合与三维可视化 的完整示例。主要功能是对带有噪声的二维点云数据进行 最小二乘法圆拟合,并使用 open3d 创建三角网格来可视化拟合出的圆形区域。

2、代码部分:

import numpy as np
import open3d as o3d

# 参数设置
radius = 5.0  # 圆的半径
center = [0, 0]  # 圆心
num_points = 200  # 点的数量
noise_level = 0.1  # 噪声级别

# 生成近似圆的点
angles = np.linspace(0, 2 * np.pi, num_points)
x = center[0] + radius * np.cos(angles)
y = center[1] + radius * np.sin(angles)
z = np.zeros(num_points)  # 假设圆在XY平面
noise = np.random.normal(0, noise_level, num_points)  # 添加噪声
x += noise
y += noise
points = np.vstack((x, y, z)).T

# 拟合圆(最小二乘法)
A = np.c_[2 * points[:, 0], 2 * points[:, 1], np.ones(points.shape[0])]
b = points[:, 0]**2 + points[:, 1]**2
# 通过最小二乘法解线性方程组
params = np.linalg.lstsq(A, b, rcond=None)[0]
xc = params[0]  # 圆心的x坐标
yc = params[1]  # 圆心的y坐标
r = np.sqrt(params[2] + xc**2 + yc**2)  # 半径

# 打印拟合结果
print(f"拟合圆心: ({xc}, {yc})")
print(f"拟合圆半径: {r}")

# 使用Open3D可视化点和拟合的圆
# 创建点云对象
point_cloud = o3d.geometry.PointCloud()
point_cloud.points = o3d.utility.Vector3dVector(points)
point_cloud.paint_uniform_color([0, 1, 0])

# 创建拟合圆的点
angles = np.linspace(0, 2 * np.pi, 100)
fitted_x = xc + r * np.cos(angles)
fitted_y = yc + r * np.sin(angles)
fitted_z = np.zeros_like(fitted_x)
fitted_circle = np.vstack((fitted_x, fitted_y, fitted_z)).T

# 创建三角形网格
# 创建网格的顶点:包括圆心和圆上所有的点
vertices = np.vstack((np.array([xc, yc, 0]), fitted_circle))  # 加上圆心作为网格的一部分
num_vertices = len(vertices)

# 创建三角形面:连接圆心和相邻的点
triangles = []
for i in range(1, len(fitted_circle)):
    triangles.append([0, i, (i + 1) % len(fitted_circle) + 1])
# 连接最后一个点到第一个点
triangles.append([0, len(fitted_circle), 1])

# 创建TriangleMesh对象
mesh = o3d.geometry.TriangleMesh()
mesh.vertices = o3d.utility.Vector3dVector(vertices)
mesh.triangles = o3d.utility.Vector3iVector(triangles)

# 设置颜色
mesh.paint_uniform_color([1, 0, 0])  # 红色

# 显示点云和拟合的圆网格
o3d.visualization.draw_geometries([point_cloud, mesh])

3、运行结果:

open3d 点云拟合圆 mesh_第1张图片

 

你可能感兴趣的:(python,点云处理,numpy,python,open3d,经验分享,点云,拟合圆,mesh)