微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenCV:什么会导致大部分为黑色的立体视差图?

如何解决OpenCV:什么会导致大部分为黑色的立体视差图?

我一直在研究 OpenCV 及其包含的立体视觉功能,并且在按照在线 OpenCV documentationmany articles 中的说明进行操作的同时努力获得良好的结果。具体来说,我相信在这一点上我已经设法获得了不错的相机校准、不错的立体校准,甚至是不错的校正,但是在移动创建视差图时,我似乎又回到了胡说八道。

我使用了一组通过 Pentax K-3 ii 相机使用 Loreo Lens-in-a-Cap CCD 分光器拍摄的自采集图像,它为我提供了在一个 CCD 上拍摄的“两个”图像。然后我可以将图像分成两半(并修剪重叠附近的一些像素),以便在相机的世界坐标中获得可靠的基线距离。不幸的是,我没有关于这种配置的真实焦距的信息,但我猜它在 9 厘米左右。

我对每个分割图像集进行了相机校准,以获得相机矩阵、距离系数以及用于对极几何的对象和图像点。然后,按照 [1,2] 中列出的程序,执行立体声校准和校正。我没有嵌入图像所需的声誉,so please click here. 根据我的理解,两个图像中的相似特征与我在它们之间绘制的真实水平线的距离相似,这意味着这是一个很好的校正结果,并且应该可以用。

但是,当我实现以下代码来创建视差图时:

# Settings for cv.StereoSGBM_create
mindisparity = 1
numdisparities = 64
blockSize = 1
disp12MaxDiff = 1
uniquenessRatio = 10
speckleWindowSize = 0
speckleRange = 8
stereo = cv.StereoSGBM_create(mindisparity=mindisparity,numdisparities=numdisparities,blockSize=blockSize,disp12MaxDiff=disp12MaxDiff,uniquenessRatio=uniquenessRatio,speckleWindowSize=speckleWindowSize,speckleRange=speckleRange)

# Calculate the disparity map
disp = stereo.compute(imgL,imgR).astype(np.float32)
# normalize the values to spread them across the viewable range
disp = cv.normalize(disp,255,cv.norM_MINMAX)

# Resize for display
disp = cv.resize(disp,(1000,1000))
cv.imshow("disparity",disp)
cv.waitKey(0)

The result is disheartening. 直观地,看到边缘周围有很多黑色空间实际上是相当明确的(例如在棋盘图案中或靠近我的手),这表明差异很小。然而,我似乎很清楚这些图像在翻译方面有很大的不同,所以我有点困惑。我一直在钻研文档并且没有想法。我尝试重用生成初始对极线集的代码 here ,它似乎在原始图像上工作得很好。然而,它产生certainly not horizontal的极线。这告诉我有些问题,但我不明白可能是什么,特别是考虑到我上面描述的“视觉测试”。我怀疑我误用了这部分代码

我的一个想法是我需要使用 ROI 来选择图像的有效部分,但我不确定如何去做。我认为这得到了校正后左图像右边缘奇怪的裸奔行为的支持

This is a link to a pastebin of all of my code,aside from the initial camera calibration which has significant runtime due to the size of the images.

我很感激能提供的任何帮助,因为此时我有代码盲。由于我的声誉,我仅限于 8 个链接,所以如果我能提供更好的图片或我的作品文档,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。