2015-12-03 8 views
1

Я работаю над проектом коррекции зрения с установкой стереокамеры. Для моего разработанного алгоритма мне нужно, чтобы камеры были откалиброваны, а изображения исправлены. Я также хочу сделать это в режиме реального времени. Есть ошибка, которую я получаю, пытаясь использовать метод cv2.stereoCalibrate, я искал экстенсивно и читал официальную документацию, но ни один из них не смог мне помочь, даже после повторной обработки моего кода несколько раз.Python OpenCV Stereo Camera Calibration Array Error: TypeError: dataPoints1 тип данных = 17 не поддерживается

Здесь:

import cv2 
import numpy as np 
import Camera 

def calibrate(camera1, camera2): 
    if(isinstance(camera1, Camera.Camera) & isinstance(camera2, Camera.Camera)): 
     pass 
    else: 
     raise ValueError("Wrong input types. Expecting: <Camera>, <Camera> \n Got: <" + 
         str(camera1.__class__) +'>, <' + str(camera2.__class__) +'>.\n') 
    #instantiate Real-world object point matrix 
    objPoints = np.zeros(((9*6), 3), np.int32) 
    objPoints[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2) 

    #Chessboard pattern dimesntions 
    dims = (9, 6) 

    #2 arrays to store 3D and 2D object points 
    objPArray = [] 
    imgPArrayr = [] 
    imgPArrayl = [] 

    #some useful matrices 
    R = [] # rotation matrix 
    T = [] # translation vector beterwwn coordinate systems 
    E = [] # essential matrix 
    F = [] #fundamental matrix 
    Q = [] #disparity to depth mapping matrix 

    criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 
       100, 1e-5) 
    flags = (cv2.CALIB_FIX_ASPECT_RATIO + cv2.CALIB_ZERO_TANGENT_DIST + 
      cv2.CALIB_SAME_FOCAL_LENGTH + cv2.CALIB_FIX_INTRINSIC) 

    ret,imgr = camera1.read() 
    ret,imgl = camera2.read() 

    #Converting to greyscale, as OpenCV requires it for calibration 
    grey_imgr = cv2.cvtColor(imgr, cv2.COLOR_BGRA2GRAY) 
    grey_imgl = cv2.cvtColor(imgl, cv2.COLOR_BGRA2GRAY) 


    ret, cornersr =cv2.findChessboardCorners(grey_imgr,dims) 
    cv2.drawChessboardCorners(grey_imgr, dims,cornersr,0) 

    ret, cornersl =cv2.findChessboardCorners(grey_imgl,dims) 
    cv2.drawChessboardCorners(grey_imgl, dims, cornersl,0) 

    cv2.imshow("chessboard", grey_imgr) 
    cv2.imshow("chessboard1", grey_imgl) 

    imgPArrayl.append(cornersl) 
    imgPArrayr.append(cornersr) 
    objPArray.append(objPoints) 
    ''' 
    cv2.imwrite("./test_images/img_r"+str(i)+".jpg",imgr) 
    cv2.imwrite("./test_images/img_l"+str(i)+".jpg",imgl) 
    i+=1 
    ''' 

    objPArray = [np.asarray(x) for x in objPArray] 
    imgPArrayl = [np.asarray(x) for x in imgPArrayl] 
    imgPArrayr = [np.asarray(x) for x in imgPArrayr] 

    print imgPArrayl 
    print imgPArrayr 

    retvalCalib, cameraMatrixl, distCoeffsl, cameraMatrixr, distCoeffsr, R, T, E, F =\ 
     cv2.stereoCalibrate(objPArray, 
          imgPArrayl, 
          imgPArrayr, 
          (9*6), 
          None, 
          None, 
          None, 
          None, 
          (640,480), 
          criteria, 
          flags) 

    return retvalCalib, cameraMatrixl, distCoeffsl, cameraMatrixr, distCoeffsr, R, T, E, F 

Ошибка я получаю: TypeError: тип imagePoints1 данных = 17 не поддерживается

Что мне делать?

+0

Возможно, вы предоставили дополнительную информацию: ** Версия OpenCV **, версия python и какие усилия вы сделали? Очевидно, что в вашем случае 'cv2.stereoCalibrate' не принимает один из ваших точечных массивов (' imgPArrayl'), но я не могу воспроизвести эту ошибку с ** OpenCV 3.0.0 **. – avtomaton

+0

OpenCV3 с Python 2.7. Я просмотрел документацию и пробовал всевозможные аргументы доступа к функции. Я также изменил определения переменных для ячеек массива (между np.int/float/double/32/64) –

ответ

0

Перекомпиляция OpenCV3 из источника и его повторная установка устраняют эту проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^