【问题标题】:3D Recontruction from only two 2D images w/ iPhone 7 camera仅使用 iPhone 7 相机从两个 2D 图像进行 3D 重建
【发布时间】:2018-06-24 15:10:46
【问题描述】:

主要问题:

仅从 2 张图像重建一个对象(至少可以从 2 张图像中感知到)。

关于相机:

我使用的是 iPhone 7 相机,并且我正在拍摄自己的照片,这意味着我可以校准我的相机。我可以从https://www.anandtech.com/show/10685/the-iphone-7-and-iphone-7-plus-review/6 获得焦距(4mm)和传感器宽度(3.99mm)。我也知道我可以从这些已知值和我的 c_x 和 c_y 中获得以像素为单位的焦距,我不确定校准是否正确。

我目前的做法:

我采用的方法与本文中使用的方法非常相似:3D reconstruction from 2 images with baseline and single camera calibration

算法:

criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)

feature_params = dict( maxCorners = 100, qualityLevel = 0.3, minDistance = 7, blockSize = 7 )

lk_params = dict( winSize = (15,15),maxLevel = 20, criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

  • 使用enter code here在此处输入代码cv2.goodFeaturesToTrack(gray,mask = None, **feature_params)从左侧图像进行角点检测
  • 使用corners1= cv2.cornerSubPix(gray,corners1,(11,11),(-1,-1),criteria) 优化找到的角落
  • 使用光流在右侧图像上查找角点corners_r, st, err = cv2.calcOpticalFlowPyrLK(gray, r_gray, corners1, None, **lk_params)
  • 只保留优点good_left = corners1[st==1]和good_right = corners_r[st==1](Feature match images)
  • 从选定的点F, mask = cv2.findFundamentalMat(good_left,good_right,cv2.FM_RANSAC)中找到基本矩阵
  • 使用_,H1,H2=cv2.stereoRectifyUncalibrated(good_left, good_right, F, right.shape[:2], threshold=5.0)计算图像校正的H1、H2
  • 纠正图片new_left = cv2.warpPerspective(img5,H1,img5.shape[:2],cv2.INTER_LINEAR or cv2.INTER_NEAREST) new_right= cv2.warpPerspective(img3,H2,img3.shape[:2],cv2.INTER_LINEAR or cv2.INTER_NEAREST)(图片如下图1)
  • 在 opencv 中使用sgbm 计算视差图。
  • 使用reprojectImageTo3D重建3D对象

问题:

  • 由于使用我的相机矩阵 array([[ 3.25203085e+03, 0.00000000e+00, 1.54093581e+03], [ 0.00000000e+00, 3.26746422e+03, 1.91792736e+03], [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]]) 和 dist_coeffs array([[ 0.16860882, -1.25881837, -0.01130431, -0.01046869, 2.09480747]]) 会扭曲我的图像,因此目前无法消除图像失真。使用 46 张不同角度和视角的棋盘图案图像计算这些值。
  • 对相应的图像使用带有 H1 和 H2 的 warpPerspective 会稍微剪切图像。 Look at sheared images here.(图一)

问题:

  • 我获得了total error: 0.457120388(我认为不错)按照此处的步骤进行相机校准:https://docs.opencv.org/3.1.0/dc/dbb/tutorial_py_calibration.html 这是一个好的错误吗?
  • 我的图像中的剪裁是否应该看起来像它实际的样子?我认为这种额外的剪切来自使用光流的特征匹配,也许有几个特征并不真正匹配。有什么好的方法可以更精确地过滤它们?我听说我也可以使用 Zhang 的算法来纠正这种剪切,但不确定我将如何应用它。这也需要适用于其他图像,这意味着我希望有一个更强大的方法,而不仅仅是这两个图像。

抱歉,如果不够准确,如果您需要更多信息,请告诉我。我也一直在寻找答案,所以我只问这个问题,因为到目前为止我无处可去。

提前非常感谢任何帮助。谢谢各位!

【问题讨论】:

  • 你好 maxmine11.. 你的问题付出了很多努力。但是.. 完成tour 并编辑您的问题,以便我们看到代码、错误并通过测试来重现它。从那里我们可以帮助并尝试与您解决手头的问题。提示您的算法:请参阅How to create a Minimal, Complete, and Verifiable example。尽情享受吧 ;-)
  • 嗨@ZF007,感谢您的建议。我对我的问题进行了一些更改以使其更清楚。此外,我得到的错误是由于我正在使用的程序(很可能是不正确的)而不是实际的代码,这就是为什么我试图专注于传达它,但我愿意接受更多的批评。提高自己:) 再次感谢!
  • 您尝试做的事情非常困难。第 1 步始终是正确进行校准,看起来您正在努力实现这一目标。 April cal 我也很幸运,它有时比 OpenCV 的校准更容易使用。 april.eecs.umich.edu/wiki/Camera_suite。第二部分是确定您是否真的只需要拍摄两张图像而不需要其他任何东西。你能得到其他可能告诉你相机如何移动的数据吗?如果没有其他数据,比例因子将是困难的。例如,您如何区分物体和物体的小照片?

标签: python opencv computer-vision stereo-3d 3d-reconstruction


【解决方案1】:

几点:

  1. 为了舒适,您的校准 RMSE 似乎有点高。您应该瞄准 0.1 像素。我建议逐张绘制残差向量,看看是否有异常值。另请参阅this answer 中的更多建议。
  2. 通常不公布失真系数。您需要进行校准才能获得它们。
  3. 您观察到的“剪切”是由于校正造成的。您可以在不校正的情况下目视检查核线误差 - 在一张图像中选择像素 x,在另一张图像中绘制相应的核线,并查看它是否通过了与 x 匹配的像素 x'。重复几次。
  4. 校正图像的目视检查是两个图像的对应行是否对齐。

【讨论】:

  • 嗨@FrancescoCallari 感谢您提供有关校准的建议,我会尝试的!关于剪切,我知道共轭极线必须彼此对齐,但我想知道由于校正而不是检查每个点是否都位于其相应的极线上,是否有更通用的解决方法来解决这种剪切?如果我每次为一个物体拍摄两张照片时都需要这样做,我想知道这是否有效。再次感谢您抽出宝贵时间帮助我!
猜你喜欢
  • 2015-11-03
  • 2012-10-21
  • 2015-10-18
  • 2014-09-11
  • 2018-03-08
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多