Во-первых, ваша матрица камеры ошибочна. Если вы читали , он должен выглядеть следующим образом:
fx 0 cx
0 fy cy
0 0 1
Если вы посмотрите на вашей, вы получили это неправильный путь вокруг:
fx 0 0
0 fy 0
cx cy 1
Итак, сначала установите camera_matrix
на camera_matrix.T
(или измените, как вы строите camera_matrix
. Помните, что camera_matrix[i,j]
is строкаi
, столбецj
).
camera_matrix = camera_matrix.T
Далее, я запустил свой код, и я вижу, что «не могу заставить его работать» означает следующее сообщение об ошибке (кстати - всегда говорят, что вы подразумеваете под «не могу показаться, чтобы получить это работать»в ваших вопросах - если это ошибка, отправьте сообщение об ошибке Если он работает, но дает вам извращенец номера, так сказать):
OpenCV Error: Assertion failed (ni >= 0) in collectCalibrationData, file /home/cha66i/Downloads/OpenCV-2.3.1/modules/calib3d/src/calibration.cpp, line 3161
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
cv2.error: /home/cha66i/Downloads/OpenCV-2.3.1/modules/calib3d/src/calibration.cpp:3161: error: (-215) ni >= 0 in function collectCalibrationData
Я тогда прочитал (очень полезно, кстати) и. заметили, что obj_points
и img_points
должны быть векторами векторов, так как можно подавать в наборах объектов/точек изображения s для нескольких изображений одной шахматной доски (/ калибровочных точек).
Следовательно:
cv2.calibrateCamera([obj_points], [img_points],size, camera_matrix, dist_coefs)
Что? Я все равно получаю такую же ошибку ?!
Затем я взглянул на образцы OpenCV python2 (в папке OpenCV-2.x.x/samples/python2
), и заметил calibration.py
, показывая мне, как использовать калибровочные функции (никогда не недооценивают образцы, они часто лучше, чем в документации!) ,
Я попытался запустить calibration.py
, но он не запускается, потому что он не содержит аргументы camera_matrix
и distCoeffs
, которые необходимы. Поэтому я модифицировал его для подачи в манекене camera_matrix
и distCoeffs
, и эй, он работает!
Единственная разница, которую я вижу между моими obj_points
/img_points
и их, заключается в том, что у них есть dtype=float32
, а у меня нет.
Итак, я изменяю мой obj_points
и img_points
также иметь DTYPE float32 (интерфейс python2 к OpenCV смешно как то, часто не работают, когда матрицы не имеют dtype
):
obj_points = obj_points.astype('float32')
img_points = img_points.astype('float32')
Затем я попробую еще раз:
>>> cv2.calibrateCamera([obj_points], [img_points],size, camera_matrix, dist_coefs)
OpenCV Error: Bad argument
(For non-planar calibration rigs the initial intrinsic matrix must be specified)
in cvCalibrateCamera2, file ....
Что ?! По крайней мере, другая ошибка.Но I сделал снабдить исходную внутреннюю матрицу!
Так я возвращаюсь к документации, и обратите внимание на flags
параметр:
флаги - Различные флаги, которые могут быть нулем или комбинацией следующих значений:
CV_CALIB_USE_INTRINSIC_GUESS
cameraMatrix содержит действительный инициал значения Рх, Ру, сх, су, которые оптимизированы далее
...
Ага, так что я должен сказать функцию явно использовать исходные предположения я представил:
cv2.calibrateCamera([obj_points], [img_points],size, camera_matrix.T, dist_coefs,
flags=cv2.CALIB_USE_INTRINSIC_GUESS)
Ура! Оно работает!
(Мораль истории - читайте документацию OpenCV тщательно и использовать последнюю версию (т.е. на opencv.itseez.com), если вы используете интерфейс Python cv2
Кроме того, ознакомьтесь с примерами в каталоге samples/python2
к. добавьте документацию. С этими двумя вещами вы сможете решить большинство проблем.)
Что вы подразумеваете под «не может показаться, чтобы заставить его работать» - это дает некоторую ошибку? (в этом случае, какая ошибка?) Или это работает и просто не дает вам коэффициенты, которые вы ожидаете? –