如何创建具有自定义起点和步长值的矩形网格
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
。
我正在做一个需要校准相机的项目。如您所知,需要在 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. ]]
注意所有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
。