首页 > 解决方案 > 如何确定具有坐标对的变换矩阵?

问题描述

所以。我有 4 组坐标对。一个在世界坐标中,另一个在相机坐标中。

+-----+-----+-----+-----+-----+
| Xw  | Yw  | Zw  | Xc  | Yc  |
+-----+-----+-----+-----+-----+
| 0,0 | 0,0 | 0,0 | 582 | 344 |
| 7,0 | 0,0 | 0,0 | 834 | 338 |
| 0,0 | 5,0 | 0,0 | 586 | 529 |
| 7,0 | 5,0 | 0,0 | 841 | 522 |
+-----+-----+-----+-----+-----+

Xw, Yw, Zw- 世界坐标
Xc, Yc- 相机坐标
Zw- 始终为 0

现在我需要为此计算一个变换矩阵。因此,拥有 Xw 和 Yw i 可以产生 Xc、Yc。

我也有摄像机 2。然后,使用摄像机 2 的某个点位置,我需要计算第一个摄像机坐标中的同一点。

+-------+-------+-------+-------+
| Xc2   | Yc2   | Xс1   | Yс1   |
+-------+-------+-------+-------+
|  1250 |   433 |   209 |   771 |
|   528 |   452 |  1277 |   730 |
+-------+-------+-------+-------+
# `Xc1` and `Yc1` just estimated for example - need to be calculated

我们还有来自 OpenCV 的相机 2 校准数据。

谢谢。

Ps 如果您能描述如何使用 python + numpy 进行操作,我将不胜感激

Pss 如果您将其描述为橡皮鸭(wenk):)

标签: pythonnumpyopencvlinear-algebra

解决方案


您可能需要仔细考虑场景的几何形状,但是线性代数可能会给您带来合理的结果。

如果我们采用您的世界坐标来拟合一般形式,那么我们可以使用numpy 的 lstsq函数aX + bY +c进行最小二乘拟合。

world = numpy.array([
    [0,0,0],
    [7,0,0],
    [0,5,0],
    [7,4,0]])
    
camera = numpy.array([
    [582,344],
    [834,338],
    [586,529],
    [841,522]])
    
#Lose Z axis
world = world[:,0:2]

#Make a square matrix
A = numpy.vstack([world.T, numpy.ones(4)]).T

#perform the least squares method
x, res, rank, s = numpy.linalg.lstsq(A, camera, rcond=None)

#test results
print(numpy.dot(A,x))


推荐阅读