numpy 如何正确使用“cv2.estimateAffine3D”来对齐两个3D坐标系?

hrysbysz  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(207)

我必须对齐两个三维坐标系,每个坐标系有32个点在真实的世界中的坐标。
我已经知道我必须计算平移和旋转,我(认为)我也明白计算是什么。因为一些聪明的人已经解决了这个问题,我只是想使用openCV来解决这个问题,我问了aiChatBot如何在没有openCV和有openCV的情况下进行计算。
但我认为使用“cv2.estimateAffine3D”看起来是正确的。
也许有些人可以给予我一个例子,如何正确使用它?目前的代码与例子,我从aiChatBot看起来像这样:

import cv2
import numpy as np

# Define the coordinates of the three points in the first coordinate system
p1 = np.array([[1, 2, 3]], dtype=np.float32)
p2 = np.array([[4, 5, 6]], dtype=np.float32)
p3 = np.array([[7, 8, 9]], dtype=np.float32)

# Define the coordinates of the three points in the second coordinate system
q1 = np.array([[1, 2, 3]], dtype=np.float32)
q2 = np.array([[5, 6, 7]], dtype=np.float32)
q3 = np.array([[9, 10, 11]], dtype=np.float32)

# Calculate the affine transformation that aligns the two coordinate systems
T = cv2.estimateAffine3D(p1, p2, p3)

# Reshape the point arrays to 2D or 3D
q1_reshaped = q1.reshape(1, -1, 3)
q2_reshaped = q2.reshape(1, -1, 3)
q3_reshaped = q3.reshape(1, -1, 3)

# Apply the transformation to the second coordinate system
q1_aligned = cv2.transform(q1_reshaped, T)
q2_aligned = cv2.transform(q2_reshaped, T)
q3_aligned = cv2.transform(q3_reshaped, T)

# Print the transformed points
print(q1_aligned)
print(q2_aligned)
print(q3_aligned)

字符串

我得到的错误是:

错误:OpenCV(4.6.0):-1:错误:(-5:Bad argument)in function 'transform'
重载解决失败:

  • m不是一个数字元组
  • 应为cv::UMat参数“m”的Ptr
    从aiChatBot解决这个问题的答案是:“看起来你遇到的错误是由传递一个不正确的参数给cv2.transform函数引起的。cv2.transform函数期望2D或3D点数组作为第一个参数,3x 3或3x 4变换矩阵作为第二个参数,但你传递的是1D点数组和3x 3或3x 4变换矩阵作为参数。

若要修复此错误,您需要将2D或3D点数组作为第一个参数传递给cv2.transform函数。您可以通过使用np.reshape函数重新整形1D点数组q1、q2和q3来完成此操作,如下所示:“
但是我们进入了一个循环,因为这个“解决方案”已经在代码中了。
所以我真的找不到任何关于这方面的信息。有人能帮我吗?
干杯!
我想把两个坐标系对齐。

vd2z7a6w

vd2z7a6w1#

estimateAffine3D只需要两个矩阵。尝试:

T = cv2.estimateAffine3D(np.asarray([p1, p2, p3]), np.asarray([q1, q2, q3]))

字符串

相关问题