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

标签 python numpy opencv grid camera-calibration

我正在做一个需要校准相机的项目。如您所知,需要在 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. ]]
Grid
如上图所示,第一个网格(用于第一个相机)从定义的引用 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/

相关文章:

OpenCV:将矩阵乘以范围 (0,1) 中的常数。如何处理数据?

c++ - 如何在 opencv 中使用眼点裁剪图像?

python - 在调用 Airflow 测试时设置 dag_run.conf 参数

python - 图像区域的直方图

python - 将值(0 除外)从数组 2 复制到数组 1

python - 提高重复 groupby 操作的性能

android - 使用OpenCV在Android中检测图像的边缘?

python - 在 Windows 上安装 python ssh 库很困难(ssh 已替换为 "paramiko")

python - ord() 预期长度为 1 的字符串,但找到了 int

python - iter(callable, sentinel)有什么用?