joh*_*jik 5 python 3d opencv matrix fundamental-matrix
我正在尝试从多个 2d 图像重建 3d 形状。我已经计算了一个基本矩阵,但现在我不知道如何处理它。
我在堆栈溢出和学术论文中发现了多个相互矛盾的答案。例如,Here说您需要从基本矩阵计算旋转和平移矩阵。
这里说你需要找到相机矩阵。
这里说你需要找到同形异义词。
这里说你需要找到对极线。
是哪个??(我该怎么做?我读过H&Z 的书,但我不明白。它说我可以“轻松”使用结果 9.14 中的“直接公式”,但结果 9.14 既不容易也不容易理解。)
堆栈溢出需要代码,所以这是我目前所拥有的:
# let's create some sample data
Wpts = np.array([[1, 1, 1, 1], # A Cube in world points
[1, 2, 1, 1],
[2, 1, 1, 1],
[2, 2, 1, 1],
[1, 1, 2, 1],
[1, 2, 2, 1],
[2, 1, 2, 1],
[2, 2, 2, 1]])
Cpts = np.array([[0, 4, 0, 1], #slightly up
[4, 0, 0, 1],
[-4, 0, 0, 1],
[0, -4, 0, 1]])
Cangles = np.array([[0, -1, 0], #slightly looking down
[-1, 0, 0],
[1, 0, 0],
[0,1,0]])
views = []
transforms = []
clen = len(Cpts)
for i in range(clen):
cangle = Cangles[i]
cpt = Cpts[i]
transform = cameraTransformMatrix(cangle, cpt)
transforms.append(transform)
newpts = np.dot(Wpts, transform.T)
view = cameraView(newpts)
views.append(view)
H = cv2.findFundamentalMat(views[0], views[1])[0]
## now what??? How do I recover the cube shape?
Run Code Online (Sandbox Code Playgroud)
编辑:我不知道相机参数
首先,听听基本的矩阵歌曲;)。
基本矩阵仅显示 2 个图像(x' - 图像 2,x - 图像 1)中的点对应之间的数学关系。“这意味着,对于所有对应点对都成立” (维基百科)。这也意味着,如果您有异常值或不正确的点对应,它会直接影响您的基本矩阵的质量。
此外,3张图像之间的点对应关系也存在类似的结构,称为Trifocal Tensor。
仅使用基本矩阵的属性进行3d 重建是不可能的,因为“对极几何是两个视图之间的内在投影几何。它独立于场景结构,仅取决于相机的内部参数和相对姿势。” (赫兹,第 239 页)。
参考您的问题如何从多个图像重建形状,您需要了解图像的相机矩阵(K',K)。相机矩阵是一个 3x3 矩阵,由相机焦距或主距离 (fx, fy) 以及光学中心或主点 (cx, cy) 组成。
您可以使用相机校准导出相机矩阵。
当您知道相机矩阵时,您可以将基本矩阵扩展为基本矩阵 E。
您可以很草率地说您的基本矩阵现在已“校准”。
与第一个图像相比,基本矩阵可用于获得第二个图像的旋转(旋转矩阵 R)和平移(向量 t),直到投影重建为止。t 将是一个单位向量。为此,您可以使用 OpenCV 函数decomposeEssentialMat或recoverPose(使用手性检查)或阅读 HZ 中的进一步详细说明。
了解您的平移和旋转,您可以为您的图像构建投影矩阵。投影矩阵定义为. 最后,您可以使用三角测量 (
triangulatePoints) 来导出图像点的 3d 坐标。我建议使用后续的捆绑调整来获得正确的配置。openCV 中还有一个 sfm 模块。
由于单应性或对极线知识对于 3d 重建不是必需的,因此我没有解释这些概念。
| 归档时间: |
|
| 查看次数: |
3238 次 |
| 最近记录: |