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

2024-05-14 23:13:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在深入研究OpenCV及其包含的立体视觉功能,并在遵循OpenCV documentationmany{a3}在线说明的同时努力获得良好的效果。具体地说,我相信在这一点上,我已经设法获得了我的相机的一个像样的校准,一个像样的立体校准,甚至一个像样的校正,但是当我开始创建视差图时,我似乎又得到了一些废话

我使用的是一组用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,0,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个链接,由于我的声誉,所以请让我知道,如果我可以提供更好的图像或我的工作文件


Tags: the代码图像距离cv校准校正disp

热门问题