Калибровка камеры OpenCV, не может контролировать константы искажения

Все, у меня есть скрипт на питоне, который использует OpenCV для калибровки камеры. Теперь он работает с большой помощью из справки stackoverflow. Но у меня проблемы с константами искажения. Кажется, я не могу контролировать количество подходящих констант. Мне нужны только 4 константы искажения, а не 5. В документации указано: «То есть, если вектор содержит четыре элемента, это означает, что K3 = 0», это то, что я хочу. Итак, я инициирую dist_const = np.zeros(4), передаю его в cv2.calibrateCamera, но возвращенный dist_const имеет 5 возвращаемых констант. Я также пробовал флаг CV_CALIB_FIX_K3, но продолжаю получать ошибку «iteger должен быть назначен». Кто-нибудь видел такое поведение раньше, любая помощь будет очень признательна.

import cv2 
from cv2 import cv 
import numpy as np

obj_points = [[-9.7,3.0,4.5],[-11.1,0.5,3.1],[-8.5,0.9,2.4],[-5.8,4.4,2.7],[-4.8,1.5,0.2],[-6.7,-1.6,-0.4],[-8.7,-3.3,-0.6],[-4.3,-1.2,-2.4],[-12.4,-2.3,0.9],[-14.1,-3.8,-0.6],[-18.9,2.9,2.9],[-14.6,2.3,4.6],[-16.0,0.8,3.0],[-18.9,-0.1,0.3],[-16.3,-1.7,0.5],[-18.6,-2.7,-2.2]]

img_points = [[993.0,623.0],[942.0,705.0],[1023.0,720.0],[1116.0,645.0],[1136.0,764.0],[1071.0,847.0],[1003.0,885.0],[1142.0,887.0],[886.0,816.0],[827.0,883.0],[710.0,636.0],[837.0,621.0],[789.0,688.0],[699.0,759.0],[768.0,800.0],[697.0,873.0]]

obj_points = np.array(obj_points,'float32')
img_points = np.array(img_points,'float32')

w = 1680
h = 1050
size = (w,h)

camera_matrix = np.zeros((3,3),'float32')
camera_matrix[0,0]= 2200.0
camera_matrix[1,1]= 2200.0
camera_matrix[2,2]=1.0

camera_matrix[0,2]=750.0 
camera_matrix[1,2]=750.0

dist_coefs = np.zeros(4,'float32')

retval,camera_matrix,dist_coefs,rvecs,tvecs = cv2.calibrateCamera([obj_points],[img_points],size,camera_matrix,dist_coefs,flags=cv.CV_CALIB_USE_INTRINSIC_GUESS)

print camera_matrix
print dist_coefs

ссылка на мой другой вопрос, есть результаты для dist_coefs из кода Caltech Matlab, который я пытаюсь заменить на python/opencv.

Джон


person hokiebird    schedule 13.04.2012    source источник


Ответы (3)


Измените свой вызов calibrateCamera на:

retval,camera_matrix,dist_coefs,rvecs,tvecs = cv2.calibrateCamera([obj_points],[img_points],size,camera_matrix,dist_coefs,flags=cv2.CALIB_USE_INTRINSIC_GUESS + cv2.CALIB_FIX_K3)

Вы не хотите, чтобы я смешивал пространства имен cv2 и cv, как вы сделали в своем примере.

person Jed    schedule 23.04.2012

Я понимаю что ты имеешь ввиду. Возможно, потому что вы используете только одно изображение для калибровки.

person uhno    schedule 14.04.2012
comment
кажется, на этот вопрос нет хорошего ответа. Я отправил тот же вопрос в список opencv на Yahoo, но никто не ответил. вот почему большинство исследований CV выполняется с помощью Matlab. Требуется так много усилий, чтобы воспроизвести то, что у меня уже есть в Matlab. - person hokiebird; 18.04.2012

У меня была такая же проблема, и решение, которое я нашел, было следующим:

import cv2
from cv2 import cv


... flags = cv2.cv.CALIB_USE_INTRINSIC_GUESS + ...
person porcinet    schedule 26.03.2015