如何创建具有自定义起点和步长值的矩形网格

How to create a rectangular grid with custom start point and step value

我正在做一个需要校准相机的项目。如您所知,需要在 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(张正友标定)

现在我的问题是,因为我需要定义第二个网格(用于第二个摄像头),它也指定义的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