2015-12-18 2 views
2

Я пытаюсь откалибровать камеру с рыбий глаз, используя привязки python OpenCV 3.0.0 (с асимметричной сеткой), но у меня проблемы с форматированием объекта и изображения точечных массивов правильно. Мой источник тока выглядит следующим образом:OpenCV-Python - Как отформатировать массивы numpy при использовании функций калибровки

import cv2 
import glob 
import numpy as np 


def main(): 
    circle_diameter = 4.5 
    circle_radius = circle_diameter/2.0 
    pattern_width = 4 
    pattern_height = 11 
    num_points = pattern_width*pattern_height 

    images = glob.glob('*.bmp') 
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) 

    imgpoints = [] 
    objpoints = [] 
    obj = [] 

    for i in range(pattern_height): 
     for j in range(pattern_width): 
      obj.append((
       float(2*j + i % 2)*circle_radius, 
       float(i*circle_radius), 
       0 
      )) 

    for name in images: 
     image = cv2.imread(name) 
     grayimage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
     retval, centers = cv2.findCirclesGrid(grayimage, (pattern_width, pattern_height), flags=(cv2.CALIB_CB_ASYMMETRIC_GRID + cv2.CALIB_CB_CLUSTERING)) 

     imgpoints_tmp = np.zeros((num_points, 2)) 
     if retval: 
      for i in range(num_points): 
       imgpoints_tmp[i, 0] = centers[i, 0, 0] 
       imgpoints_tmp[i, 1] = centers[i, 0, 1] 

      imgpoints.append(imgpoints_tmp) 
      objpoints.append(obj) 


    # Convertion to numpy array 
    imgpoints = np.array(imgpoints, dtype=np.float32) 
    objpoints = np.array(objpoints, dtype=np.float32) 

    K, D = cv2.fisheye.calibrate(objpoints, imgpoints, image_size=(1280, 800), K=None, D=None) 

if __name__ == '__main__': 
    main() 

Сообщение об ошибке:

OpenCV Error: Assertion failed (objectPoints.type() == CV_32FC3 || objectPoints.type() == CV_64FC3) in cv::fisheye::calibrate 

objpoints имеет форму (31,44,3).

Так что массив objpoints должен быть отформатирован по-другому, но я не могу достичь правильной компоновки. Может быть, кто-то может помочь здесь?

+1

В настоящее время это проблема с привязками cv2.fisheye. https://github.com/Itseez/opencv/issues/5534 –

ответ

0

Правильный формат objpoints - это список массивов numpy с len(objpoints) = "number of pictures", и каждая запись имеет массив numpy.

Пожалуйста, взгляните на the official help. Документация OpenCV говорит о «векторах», что эквивалентно списку или numpy.array. В этом случае «вектор векторов» можно интерпретировать как список numpy.arrays.

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