使用opencv2进行深度识别

时间:2016-07-20 14:07:46

标签: python image opencv image-processing

我无法从几个简单的图像中获取正确的视差图,如下所示:

LEFT

LEFT

RIGHT

视差

disparity

代码:

import cv2
import numpy as np

# frames buffer
frames = []
# image categories
cat_selected = 0
cat_list     = ['open']
cat_calib    = [np.load('LUMIA_CALIB.npy')]

# load images
def im_load(image, calib):
    frame = cv2.imread(image,0)
    if calib is not None:
        frame = cv2.undistort(cv2.resize(frame, (640, 480)), *calib[0])
        x, y, w, h = calib[1]
        frame = frame[y : y + h, x : x + w]
    return frame

for idx, im in enumerate(['left', 'right']):
    frames.append(im_load('images/%s/%s.jpg' %(cat_list[cat_selected], im), cat_calib[cat_selected]))
    cv2.namedWindow(im, cv2.cv.CV_WINDOW_NORMAL)
    cv2.imshow(im, frames[idx])
    cv2.imwrite('%s.jpg' %im, frames[idx])

stereo = cv2.StereoBM(1, 16, 15)
disparity = stereo.compute(frames[0], frames[1])
cv2.namedWindow('map', 0)
cv2.imshow('map', cv2.convertScaleAbs(disparity))
cv2.imwrite('disparity.jpg', disparity)

cv2.waitKey(0)
cv2.destroyAllWindows()

问题

  1. 代码有什么问题,如何解决?
  2. 计算深度时相机之间的距离有什么影响?
  3. disparity矩阵值的成员单位是多少?
  4. P.S

    1. 代码计算Tsukuba图像集的视差图,但是好吧。
    2. 我不知道这是否相关,但两台相机之间的距离是14.85厘米。

1 个答案:

答案 0 :(得分:0)

问题1

您似乎忘记了通过立体声校准程序纠正图像。

问题2

两台摄像机之间的距离称为 Baseline 。通常,基线越大,距离的精度越高,在视场上牺牲。反之亦然。

问题3

如果您正在使用Python(我在OpenCV的python API中没有专家),则差异可能在像素中。一般来说,如果你想要三角测量的距离值(在现实世界中),你会想要在Python中使用reprojectImageTo3D或它的等价物。您需要首先使用棋盘校准立体装备(并知道方块的大小)。