与三维重建(Matlab)的步骤斗争

与三维重建(Matlab)的步骤斗争,matlab,3d,computer-vision,matlab-cvst,3d-reconstruction,Matlab,3d,Computer Vision,Matlab Cvst,3d Reconstruction,我们被要求做3D重建(博士学位的硕士课程),而我正在拔头发。我不确定我是否错过了任何步骤,或者我是否做错了。我试着用谷歌搜索代码,用我的函数替换它们,只是想看看我是否能从中得到正确的结果,但我不能 我将简单介绍我目前正在做的事情,我希望你们中的一位能告诉我,我遗漏了一些明显的东西: 我正在使用的图像: 加载校准左侧和右侧图像,单击相应点以获得P1和P2 使用RQ decomp获得K1和K2(以及R1、R2、t1、t2,但我似乎没有在任何地方使用它们。最初,我尝试在将P1设置为规范(I | 0)

我们被要求做3D重建(博士学位的硕士课程),而我正在拔头发。我不确定我是否错过了任何步骤,或者我是否做错了。我试着用谷歌搜索代码,用我的函数替换它们,只是想看看我是否能从中得到正确的结果,但我不能

我将简单介绍我目前正在做的事情,我希望你们中的一位能告诉我,我遗漏了一些明显的东西:

我正在使用的图像:

  • 加载校准左侧和右侧图像,单击相应点以获得P1和P2

  • 使用RQ decomp获得K1和K2(以及R1、R2、t1、t2,但我似乎没有在任何地方使用它们。最初,我尝试在将P1设置为规范(I | 0)后使用R=R1*R2',t=t2-t1创建新P2,但这也不起作用)

  • 将P1设置为规范(I | 0)

  • 使用RANSAC计算基本矩阵F和对应点im1、im2

  • 获取点处像素的颜色

  • 通过做K2'*F*K1得到基本矩阵E

  • 从E中获得4个不同的投影矩阵,然后选择正确的一个

  • 使用P1、P2、im1、im2对匹配进行三角化以获得3D点

  • 使用“散点图”绘制3D点,为其提供该点像素的RGB值

  • 我不满意的结果是:


目前,由于我没有取得任何进展,我想选择最简单的方案,并努力向上。仅供参考,我正在使用matlab。如果有人有任何建议,我真的很想听听。

如果你已经有了P1和P2,那么你可以简单地从两幅图像中三角化匹配的点对。不需要估计基本矩阵

如果您只有内部函数(K表示单个摄影机,K1和K2表示两个不同的摄影机),那么您的方法是有效的:

  • 估计基本矩阵
  • 求本质矩阵
  • 分解成R和t
  • 将P1设置为标准,并从K、R和t计算P2
  • 使用P1和P2三角化匹配点
  • 此方法在计算机视觉系统工具箱中的示例中进行了说明

    在这两种情况下,您都应该仔细检查代码,并确保所有矩阵都有意义。MATLAB的惯例是将行向量乘以矩阵,而许多教科书将矩阵乘以列向量。因此,矩阵可能需要进行转置


    在此之前,请使用showMatchedFeatures绘制点匹配图,以确保这些特征是合理的。

    这是一个奇怪的原因,为什么它不起作用。我使用的是matlab的
    detectSURFFeatures
    ,它给出了不准确的匹配对。我从来没有认为这是错误的,但我的一个同学也有同样的问题。我改为使用
    detectEigenMinFeatures
    ,效果很好!这是我现在的结果,它不是完美的,但它要好得多:


    感觉上,即使这些点是正确的,你也会注意到。这真是少之又少。嘿,安德,是我,海军!什么意思?我之前放的图像是错误的(我尝试在校准图像上运行,但没有效果),我用使用场景图像的图像更改了图像。我的意思是,在结果图像中,点的数量对于3D模型来说非常小(或者看起来如此!)。如何选择三角形化的点?最后一个数字是如何绘制的?我可能理解错了,但这不应该是一个3D绘图吗?我使用
    detectSURFFeatures、extractFeatures、matchFeatures
    来获取点,通过RANSAC来获得F,并去除异常值。然后我使用
    scatter3(X(:,1),X(:,2),(X:,3))
    来绘制它们。是的,我现在旋转它并改变了图像。冲浪功能非常好,因为它们在成像中是“一致的”。它们是图像之间匹配的好点,可以得到一个好的基本矩阵。一旦你得到了基本矩阵,这意味着你知道从一个图像到另一个图像的变换,因此你可以选择任意数量的点从一个图像到另一个图像的变换!尝试在这一步之后获得密集的点云,这样您可以更好地看到整个模型已正确重建。我仍然相信,要得出结果正确性的结论,点太少了。我根据我的校准图像计算P1和P2,然后根据P1和P2计算K1和K2。这正是我正在做的。是的,这就是为什么我一直试图在我可能搞砸的地方使用别人的代码,但似乎一切都好。我的特征只是场景中对象上的点,所以这很好。对于校准图像,它们的噪声更大。当我将P1设置为[R t]时,我是否将其与K1(K1*P1)相乘,同样地,与从基本矩阵中检索到的P2相乘,是否将P2=K2*P2?SIFT功能更好,但它们是专利的:(.仍然,变换整个图像,它看起来会更酷!)我该怎么做?我得到了稀疏对应点的最小值和最大值,然后尝试做im2Coords=F'*im1Coords,但这不起作用。我是否需要归一化/反规格化,还是我做的都错了?我想它给了我与点相反的对极线,但我如何才能得到更多的点呢?啊,没关系,今天就要到了,所以我没有时间做更多的更改并写下它们!