python矩阵变化_使用Python从3D中的六个点确定均匀仿射变换矩阵

这篇博客介绍了如何使用Python找到唯一能将一组3D点映射到另一组点的同质仿射变换。通过提供一个数学公式和编程实现,详细解释了如何从六个点对构建旋转矩阵和平移向量,并最终得到4x4的仿射变换矩阵。示例代码展示了如何应用这个函数来处理特定的点集。
摘要由CSDN通过智能技术生成

单独的六点不足以唯一地确定仿射变换。但是,根据您之前在问题中提出的问题(在删除之前不久)以及your comment,您似乎不仅仅在寻找仿射变换,而是在寻找同质仿射变换。

This answer by robjohn提供了问题的解决方案。虽然它解决了许多问题的更普遍的问题,但6点的解决方案可以在答案的最底部找到。我将以更加程序员友好的格式将其转录:

import numpy as np

def recover_homogenous_affine_transformation(p, p_prime):

'''

Find the unique homogeneous affine transformation that

maps a set of 3 points to another set of 3 points in 3D

space:

p_prime == np.dot(p, R) + t

where `R` is an unknown rotation matrix, `t` is an unknown

translation vector, and `p` and `p_prime` are the original

and transformed set of points stored as row vectors:

p = np.array((p1, p2, p3))

p_prime = np.array((p1_prime, p2_prime, p3_prime))

The result of this function is an augmented 4-by-4

matrix `A` that represents this affine transformation:

np.column_stack((p_prime, (1, 1, 1))) == \

np.dot(np.column_stack((p, (1, 1, 1))), A)

Source: https://math.stackexchange.com/a/222170 (robjohn)

'''

# construct intermediate matrix

Q = p[1:] - p[0]

Q_prime = p_prime[1:] - p_prime[0]

# calculate rotation matrix

R = np.dot(np.linalg.inv(np.row_stack((Q, np.cross(*Q)))),

np.row_stack((Q_prime, np.cross(*Q_prime))))

# calculate translation vector

t = p_prime[0] - np.dot(p[0], R)

# calculate affine transformation matrix

return np.column_stack((np.row_stack((R, t)),

(0, 0, 0, 1)))对于您的样本输入,这将恢复与您从CAD程序获得的完全相同的矩阵:

>>> recover_homogenous_affine_transformation(

np.array(((1.0,1.0,1.0),

(1.0,2.0,1.0),

(1.0,1.0,2.0))),

np.array(((2.4142135623730940, 5.732050807568877, 0.7320508075688767),

(2.7677669529663684, 6.665063509461097, 0.6650635094610956),

(2.7677669529663675, 5.665063509461096, 1.6650635094610962))))

array([[ 0.8660254 , -0.35355339, -0.35355339, 0. ],

[ 0.35355339, 0.9330127 , -0.0669873 , 0. ],

[ 0.35355339, -0.0669873 , 0.9330127 , 0. ],

[ 0.84108138, 5.21957879, 0.21957879, 1. ]])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值