【发布时间】: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_coeffsarray([[ 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