【发布时间】:2021-03-03 02:28:32
【问题描述】:
我目前正在尝试基于我用作“基本相机”的第四个相机来计算 3 个相机的基本矩阵。我正在使用 OpenCV 来计算基本矩阵。
即使我的观点似乎是正确的,但当我重建相机的姿势时,它没有任何意义。例如,两个输出平移向量是 (0, 0, -1)。 我怀疑我以某种方式搞砸了内部约束的执行,但不知道如何。
我不确定我做错了什么,希望有人可以帮助我:)
basePoints = np.loadtxt("data/calibration/fundamental_matrix/resulting_data/camera0/extracted_points/points.txt")
for c in range(1, cameras):
print(f"caculating essential matrix for camera {c}")
cameraPoints = np.loadtxt(f"data/calibration/fundamental_matrix/resulting_data/camera{c}/extracted_points/points.txt")
cm = np.loadtxt(f"data/calibration/camera_matrix/resulting_data/camera{c}/cmatrix.txt")
em, mask = cv.findEssentialMat(basePoints, cameraPoints, cm, cv.RANSAC, 0.9999, 1)
print(f"essential matrix {c} 1:")
print(em)
print(f"enforcing internal constrain of essential matrix for camera {c}")
u, s, v = np.linalg.svd(em)
em = u.T * np.diag([1, 1, 0]) * v
print(f"enforced essential matrix {c} :")
print(em)
np.savetxt(f"data/calibration/essential_matrix_and_pose/resulting_data/camera{c}/ematrix.txt", em)
以下是我数据的一些标准化样本点:
基础摄像头:
6.899999999999999467e-01 4.066666666666666347e-02
6.899999999999999467e-01 4.066666666666666347e-02
6.913333333333333552e-01 4.066666666666666347e-02
6.919999999999999485e-01 4.066666666666666347e-02
6.946666666666666545e-01 4.066666666666666347e-02
6.986666666666666581e-01 4.133333333333333304e-02
7.026666666666666616e-01 4.133333333333333304e-02
7.073333333333332584e-01 4.199999999999999567e-02
7.119999999999999662e-01 4.266666666666666524e-02
7.173333333333332673e-01 4.466666666666666702e-02
第一台相机:
3.893333333333333091e-01 6.600000000000000311e-02
3.900000000000000133e-01 6.600000000000000311e-02
3.906666666666666621e-01 6.533333333333332660e-02
3.913333333333333108e-01 6.466666666666666397e-02
3.939999999999999614e-01 6.333333333333332482e-02
3.979999999999999649e-01 6.066666666666666735e-02
4.019999999999999685e-01 5.799999999999999600e-02
4.066666666666666763e-01 5.600000000000000117e-02
4.119999999999999774e-01 5.333333333333332982e-02
4.186666666666666314e-01 5.133333333333333498e-02
相机矩阵:
8.830992819912107734e+02 0.000000000000000000e+00 8.279597017259351333e+02
0.000000000000000000e+00 8.678798953432041117e+02 5.529431146654350187e+02
0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00
【问题讨论】:
-
需要最小的可重复样本。来自 OpenCV 图像校准 cpp 文件。我发现根据棋盘对应集找到正确的姿势没有问题。您的输入数据很可能存在问题。
-
我使用了在 Blender 中渲染的模拟图像,所以我的点很容易与背景区分开来。我将点绘制到图像上,它们看起来很好。我不确定如何给你一个可重现的样本,因为整个程序有点长,无法添加到帖子中。也许我可以将项目上传到 github 或其他什么?
-
显示模拟图像对和选定坐标。或者如果你真的有问题。您可以尝试使用给定的样本数据进行 opencv 校准样本,这将向您展示它的工作原理。
-
前两个图像是基座和第一个凸轮的校准图像。我有100个这样的。在第三张图像中,我绘制了基础相机的所有提取点。这些绘制的点与我的模拟点一致。
-
选择的坐标?
标签: python opencv camera-calibration 3d-reconstruction