一旦我获得一些3D点坐标,我使用什么算法来匹配最佳圆柱体并获得中心轴的方向载体和半径?

Points of different cross sections on a cylinder

我之前的 idea 是将圆柱体分成层,随着层数的增加,点形成的图形越来越接近圆柱体,但在这种情况下我无法得到圆柱体的确切半径.(中心轴是通过每个层的圆的中心来获得的)

推荐答案

这是一个MCVE,用于回归由p0p1(载体)以及半径R(纯量)定义的轴.

首先我们创建一些虚拟数据集:

import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
from scipy.spatial.transform import Rotation

def cylinder(n=60, m=20, r=2, h=5):
    t = np.linspace(0, m * 2 * np.pi, m * n)
    z = np.linspace(0, h, m * n)
    x = r * np.cos(t)
    y = r * np.sin(t)
    return np.stack([x, y, z]).T

X = cylinder()
rot = Rotation.from_rotvec(np.array([-1, 2, 0.5]))
x0 = np.array([1., 2., 0.])
    
X = rot.apply(X)
X = X + x0

这创建了一个通用用例,包括起源转移.

现在,只需将几何方程(参见equation 10)写成剩余并通过最小平方将其最小化即可.

def residuals(p, xyz):
    return np.power(np.linalg.norm(np.cross((xyz - p[0:3]), (xyz - p[3:6])), axis=1) / np.linalg.norm((p[3:6] - p[0:3])), 2) - p[6] ** 2

p, res = optimize.leastsq(residuals, x0=[0., 0., 0., 1., 1., 1., 0.], args=(X,), full_output=False)

在这种情况下返回:

# array([ -1.8283916 ,  -1.65918186,   3.29901757,  # p0
#         20.31455462,  26.98786514, -22.52837088,  # p1
#          2.        ])                             # R

从图形上看,它会导致:

enter image description here

Python相关问答推荐

网页抓取数据框架但只有500个字节

取相框中一列的第二位数字

手动为pandas中的列上色

如何观察cv2.erode()的中间过程?

查找下一个值=实际值加上使用极点的50%

如何使用矩阵在sklearn中同时对每个列执行matthews_corrcoef?

计算相同形状的两个张量的SSE损失

Chatgpt API不断返回错误:404未能从API获取响应

在函数内部使用eval(),将函数的输入作为字符串的一部分

使用mySQL的SQlalchemy过滤重叠时间段

Pandas 都是(),但有一个门槛

为什么这个带有List输入的简单numba函数这么慢

如何制作10,000年及以后的日期时间对象?

管道冻结和管道卸载

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

如何启动下载并在不击中磁盘的情况下呈现响应?

名为__main__. py的Python模块在导入时不运行'

从Windows Python脚本在WSL上运行Linux应用程序

如何在TensorFlow中分类多个类

未调用自定义JSON编码器