我正在尝试从多个2d图像中重建3d形状。我已经计算了一个基本矩阵,但是现在我不知道该怎么做。
我在堆栈溢出和学术论文中发现了多个相互矛盾的答案。例如,这里说您需要从基本矩阵计算旋转和平移矩阵。
这里说您需要找到相机矩阵。
这里说你需要找到单应性。
这里说您需要找到对极线。
是哪一个?(我该怎么做?我读过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?
编辑:我不知道相机参数
首先,听基本矩阵歌曲;)。
基本矩阵仅显示2张图像(x'-图像2,x-图像1)中的点对应关系之间的数学关系。“这意味着,对所有对应点都成立” (维基百科)。这也意味着,如果您有异常或不正确的点对应关系,则将直接影响基本矩阵的质量。
另外,对于三幅图像之间的点对应关系存在类似的结构,称为三焦点张量。
不可能仅使用基本矩阵的属性进行3d重建,因为“对极几何是两个视图之间的固有投影几何。它与场景结构无关,并且仅取决于相机的内部参数和相对姿势。” (HZ,第239页)。
参考您的问题,如何从多个图像中重建形状,您需要了解图像的相机矩阵(K',K)。摄像机矩阵是一个3x3矩阵,由摄像机焦距或主要距离(fx,fy)以及光学中心或主要点(cx,cy)组成。
您可以使用相机校准来导出相机矩阵。
当您知道相机矩阵时,可以将基本矩阵扩展为基本矩阵E。
您可能会很草率地说您的基本面现在已经“校准”。
基本矩阵可用于获得第二张图片与第一张图片相比的旋转(旋转矩阵R)和平移(矢量t),直到投影重建为止。t将是一个单位向量。为此,您可以使用OpenCV函数decomposeEssentialMat
或recoverPose
(使用检查性)或阅读HZ中的更多详细说明。
了解平移和旋转后,您可以为图像建立投影矩阵。投影矩阵定义为。最后,您可以使用triangulation(triangulatePoints
)导出图像点的3d坐标。我建议使用后续的包调整来接收正确的配置。openCV中还有一个SFM模块。
由于单应性或极线知识对于3d重建基本上不是必需的,因此我没有解释这些概念。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句