我正在做一个需要校准相机的项目。如您所知,需要在 3D 世界中定义平面网格点并在图像平面上找到它们的对应关系。因此,第一个相机有以下 3D_grid 点:
mport cv2 as cv
import numpy as np
WPoints_cam1 = np.zeros((9*3,3), np.float64)
WPoints_cam1[:,:2] = np.mgrid[0:9,0:3].T.reshape(-1,2)*0.4
print(WPoints_cam1)
[[0. 0. 0. ]# world coordinate center
[0.4 0. 0. ]
[0.8 0. 0. ]
[1.2 0. 0. ]
[1.6 0. 0. ]
[2. 0. 0. ]
[2.4 0. 0. ]
[2.8 0. 0. ]
[3.2 0. 0. ]
[0. 0.4 0. ]
[0.4 0.4 0. ]
[0.8 0.4 0. ]
[1.2 0.4 0. ]
[1.6 0.4 0. ]
[2. 0.4 0. ]
[2.4 0.4 0. ]
[2.8 0.4 0. ]
[3.2 0.4 0. ]
[0. 0.8 0. ]
[0.4 0.8 0. ]
[0.8 0.8 0. ]
[1.2 0.8 0. ]
[1.6 0.8 0. ]
[2. 0.8 0. ]
[2.4 0.8 0. ]
[2.8 0.8 0. ]
[3.2 0.8 0. ]]
如上图所示,第一个网格(用于第一个相机)从定义的引用 3D_point 开始。 (0,0,0) 并以 结束(3.2,0.8 0) 与 0.4 的恒定偏移量和 9x3 尺寸
注意所有Z坐标都设置为Z=0(Zhengyou Zhang校准)
现在我的问题是 ,因为我需要定义第二个网格(用于第二个相机),它也指定义的 3D_coordinate 中心 (0,0,0),我需要定义一个网格 从 (3.6,0,0) 到 (6.8,0.8,0) 与 相同的偏移量 0.4 尺寸为 9x3
我相信这很容易做到。但是,由于我的初学者经验水平,我不能开箱即用。
提前感谢您的帮助和感谢。
最佳答案
您可以像这样缩放每一列:
np.mgrid[0:8, 0:3].T.reshape(-1,2) * np.array([(7.8 - 3.6) / 7, 0.4]) + np.array([3.6, 0])
或将其组合成这样的缩放矩阵(然后添加一个向量进行平移)np.mgrid[0:8, 0:3].T.reshape(-1,2) @ np.array([[(7.8 - 3.6) / 7, 0], [0, 0.4]]).T + np.array([3.6, 0])
关于在哪里(7.8 - 3.6) / 7
来自,分子应该是不言而喻的。分母是相同的,但对于您的原始尺寸。与 0:8
最大值为 7
最小值为 0
所以分母变成7 - 0
.
关于python - 如何创建具有自定义起点和步长值的矩形网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63565634/