opencv - 单点错误三角测量(用 4 点板校准)
问题描述
我正在使用 6 台 RGB 摄像机拍摄一个我想以 3D 形式重建的场景,如下图所示。我忘了拿校准棋盘。所以我用一个空白的矩形板代替并拍摄它,就像我拍摄一个普通的棋盘一样。
第一步,校准--> OK。
我显然不能使用cv2.findChessboardCorners
,所以我制作了一个小程序,可以让我单击并存储每个 4 个角的位置。我从这 4 个点校准了大约 10-15 帧作为测试。
Tl;博士:它似乎工作得很好。
下一步,三角测量。--> 不行
,我使用直接线性变换 (DLT) 对所有 6 个摄像机的点进行三角测量。
Tl;Dr : 效果不太好。
- 图像和世界坐标以这种方式连接:
- 可以写成。
- 奇异值分解 (SVD) 给出
4 个点中有 3 个被正确三角剖分,但应该位于原点的蓝色点的 x 坐标错误。
为什么?
为什么只有一点,为什么只有 x 坐标?
这与我从 4 点板校准的事实有关吗?
如果是这样,你能解释一下吗?如果不是,那还能是什么?
更新:当板在其他地方时,我尝试了另一个框架,并且三角测量很好。
所以有一个谜:一些点是随机三角错误的(或者至少是原点的那个),而其他大部分都很好。再说一遍,为什么?
我的猜测是它来自三角测量而不是校准,并且与我草率的校准过程无关。
我遇到的一个常见问题是 DLT 找到的解决方案含糊不清。实际上,求解 AQ = 0 或求解 AC C-¹Q 给出了相同的解。请参见此处的第 46 页。但我不知道该怎么办。
我现在相当确定这不是校准问题,但我不想删除我帖子的这一部分。
- 我用过
ret, K, D, R, T = cv2.calibrateCamera(objpoints, imgpoints, imSize, None, None)
。它无缝地工作,并且在我的原始图像上完美重新投影的点cv2.projectPoints(objpoints, R, T, K, D)
。 - 我将我的投影矩阵 P 计算为,并且
R, _ = cv2.Rodrigues(R)
- 当我每张图像只有 4 个点时,我如何获得解决方案?我不是至少需要6个吗?
我们有.
我们可以通过 SVD 求解 P,形式如下
:This is 2 equations per point,11 个独立的未知 P 参数。所以 4 个点组成 8 个方程,这应该是不够的。
但cv2.calibrateCamera
仍然给出了解决方案。它必须使用另一种方法?我遇到了 Perspective-n-Point (PnP),它是 opencv 使用的吗?在这种情况下,是否直接优化 K、R 和 T 从而需要更少的点?
我可以人为地添加几个点来获得比我的板的 4 个角点更多的点(例如,边缘的中心,或矩形的中心)。但这真的是问题吗? - 校准时,需要将投影矩阵分解为内在矩阵和外在矩阵。但这种分解不是唯一的,有 4 个解。有关更多信息,请参见Hartley&Zisserman 关于 Cheirality的“我看到双重”部分和第 21 章
。 这不是我的问题,因为我的相机点已正确地重新投影到图像平面,并且我的相机已正确设置在我的 3D 场景中。
解决方案
我不太明白你在问什么,它相当模糊。但是,我认为您错误地计算了投影矩阵。如果我没记错的话,您肯定会以这种方式在现实世界空间中定义代表您的矩形的 4 个 3D 点,例如:
pt_3D = [[ 0 0 0]
[ 0 1 0]
[ 1 1 0]
[ 1 0 0]]
然后,您将检索每个图像的相应 2D 点(按顺序),并生成两个向量,如下所示:
objpoints = [pt_3D, pt_3D, ....] # N times
imgpoints = [pt_2D_img1, pt_3D_img2, ....] # N times ( N images )
然后,您可以校准相机并恢复相机姿势以及投影矩阵,如下所示:
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, imSize, None, None)
cv2.projectPoints(objpoints, rvecs, tvecs, K, dist)
for rvec, tvec in zip(rvecs, tvecs):
Rt, _ = cv2.Rodrigues(rvec)
R = Rt.T
T = - R @ tvec
pose_Matrix = np.vstack(( np.hstack((R,T)) , [0, 0, 0, 1])) ( transformation matrix == camera pose )
Projection_Matrix = K @ TransformationMatrix.T[:3, :4]
您不必应用 DLT 或三角测量(一切都在cv2.calibrateCamera ()
函数中完成,3D 点仍然是您自己定义的
推荐阅读
- tableau-api - 基于不同选择器字段的总和商
- web-config - redirect specific ip range using web.config
- javascript - 如何从 JavaScript 中的“Set”对象中获取单个键值?
- php - PHP 未定义索引:HTTP_ACCEPT
- javascript - 复选框单击事件上的 IFFY 函数引发错误:checkbox.addEventListener(...) 不是函数
- microsoft-graph-api - Microsoft Graph - 获取事件错误
- python - PyCharm 是否有理由抱怨这种日期比较?
- windows - 当 Windows Installer 在已安装的旧版本中具有相同 GUID 时,会使用旧名称创建文件夹
- angular - Angular 5 收到此错误找不到类型为“object”的不同支持对象“[object Object]”
- javascript - 无法使用某些类 jQuery 获取最接近的元素