#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 раза меньше для кругов по сравнению с шахматной доской. Но да, я думаю, что это разница в реализации.