неискажение opencv (калибровка камеры)

#opencv #distortion

#opencv #искажение

Вопрос:

У меня возникли проблемы с использованием API undistort() opencv.

В настоящее время я пытаюсь проверить результаты калибровки, сравнивая результаты с GML calibration tool box (//graphics.cs.msu.ru/en/node/909 ).

Ниже приведены результаты, полученные с помощью GML


 === Intrinsic ===
778.200465 0.000000 264.299668
0.000000 757.938633 383.228433
0.000000 0.000000 1.000000
=== Distortion ===
-0.102929 0.142385 0.001972 0.007185 
=== Position ===
0.0 0.0 0.0
=== Extrinsic ===
0.022835  0.913067  0.407170  -13.413557
0.642153  -0.325546  0.694016  -176.271870
0.766236  0.245618  -0.593763  251.019585
0.000000  0.000000  0.000000  1.000000

pixle error [0.12, 0.06]
 

Ниже приведены результаты выпуска OPENCV 2.4.8


 %YAML:1.0
nframes: 2
image_width: 480
image_height: 752
square_size: 15.
flags: 0
camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 7.7831650886449142e 002, 0., 2.6427482436286419e 002, 0.,
       7.5794845379782328e 002, 3.8328330268344854e 002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 5
   cols: 1
   dt: d
   data: [ -1.0303815300339793e-001, 1.4247900680485645e-001,
       1.9600293643082536e-003, 7.1852707322515265e-003, 0. ]
avg_reprojection_error: 1.3913581417364859e-001
per_view_reprojection_errors: !!opencv-matrix
   rows: 2
   cols: 1
   dt: f
   data: [ 1.34592891e-001, 1.47803366e-001 ]
 

Результаты GML и OPENCV выглядят сопоставимо на мой взгляд, но результаты без искажений выглядят совершенно иначе.

Приложил 2 изображения

отображение разницы между оригиналом и неискаженным gml — «2_gml_calib_undistorted.bmp» — используется неискаженный набор инструментов gml
введите описание изображения здесь

отображение разницы между исходным и неискаженным opencv — «3_opencv2.4.8_calib_undistorted.bmp» — с использованием opencv
введите описание изображения здесь

Также попробовал передать данные калибровки GML в функцию opencv undistort(), и результаты выглядят аналогично результатам opencv. Итак, я пришел к выводу, что проблема связана с неискаженным использованием api. Но я все еще не могу решить эту проблему.

Пожалуйста, обратите внимание: я использую следующие API-интерфейсы opencv

  • findChessboardCorners(viewGray, boardData.boardSize, point2Dbuf,CV_CALIB_CB_ADAPTIVE_THRESH CV_CALIB_CB_FILTER_QUADS);
  • calibrateCamera(objectPoints, imagePoints, imageSize, *cameraMatrix,*distCoeffs, rvecs, tvecs, flags|CV_CALIB_FIX_K3|CV_CALIB_FIX_K4|CV_CALIB_FIX_K5,TermCriteria(CV_TERMCRIT_EPS CV_TERMCRIT_ITER, 100,DBL_EPSILON));
  • undistort(view, rview, *cameraMatrix, *distCoeffs);

Любые указания для решения этой проблемы были бы очень полезны.

Спасибо,

Хари

Комментарии:

1. Использовали ли вы функцию cornerSubPix для уточнения найденных углов шахматной доски? Кроме того, почему вы исправили параметры K3, K4 и K5? Это сильно повлияет на калибровку искажений!

2. Я хочу проверить результат калибровки с помощью известной доступной ссылки, такой как GML toolbox. GML toolbox предоставляет только 4 параметра искажения, поэтому для проверки я исправил K3, K4 и K5, чтобы я мог сравнивать с ним напрямую. Но спасибо за ваше предложение, я начну играть с ним, как только у меня будет результат, который можно сравнить с GML. (В настоящее время, хотя данные калибровки из opencv и GML toolbox сопоставимы, результаты неискажения opencv отличаются по сравнению с GML.

3. Очевидно, что они разные; Ваши критерии завершения, вероятно, разные. Точка, в которой алгоритм «останавливается», зависит от того, каковы результаты. Также; насколько вы уверены, что GML toolbox не выполняет субпиксельную локализацию? Если вы не заботитесь о получении точно таких же результатов (но только лучше) Я могу порекомендовать использовать шаблон круга из OpenCV. Его тариф более точный.

4. Наллат, я попытался подключить результаты калибровки GML к функции неискажения opencv. Я ожидал, что результаты неискажения будут похожи на результаты, предоставленные GML toolbox, но они похожи на результаты opencv, показанные выше. Могу ли я заключить, что разница заключается в функциях неискажения, используемых opencv и GML? Между тем, как я пытался использовать шаблон круга, и ошибка перепроектирования была довольно высокой. После переключения на контрольную плату и точной настройки критериев завершения я получил низкие ошибки перепроектирования.

5. Как правило, ошибка проекции примерно в 2 раза меньше для кругов по сравнению с шахматной доской. Но да, я думаю, что это разница в реализации.