OpenCV применить искажение камеры - применить калибровку
У меня есть программа, которая обнаруживает объекты в потоке живого видео. Я пытаюсь компенсировать искажения в камере, я использовал инструмент калибровки OpenCV и создал файл XML с соответствующими параметрами.
Однако я не уверен, как затем применить это с помощью undistort
функция, я так понимаю, что это нужно будет применить к каждому кадру, как он захвачен?
void undistort(InputArray src, OutputArray dst, InputArray cameraMatrix, InputArray distCoeffs, InputArray newCameraMatrix=noArray() )
У меня проблемы с определением каждого из этих параметров, ниже мое текущее понимание.
undistorted(currentFrame, resultsWindow, calibrationFile, notSure, notSure);
Вызывается ли эта функция, как показано ниже:
if(captureOpen == false){
img_scene = cvCaptureFromFile(videoFeed);
}
while(1) {
image = cvQueryFrame(img_scene);
undistort();
1 ответ
неискаженный (currentFrame, resultsWindow, калибровочный файл, notSure, notSure);
Нет, это не сработает. Вам необходимо вручную прочитать ваш XML-файл и заполнить соответствующие параметры данными, найденными в файле. Файл должен содержать матрицу камеры (искать значения cx, cy, fx, fy) и параметры искажения (k1, k2, k3, p1, p2 и т. Д.).
Документация по неискажению для 2.4.x находится здесь: http://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html
типично src
это Mat
содержащий текущий кадр. dst
выход Mat
того же размера, который будет заполнен неискаженным изображением. Вам придется преобразовать это обратно в ваш предпочитаемый формат или отобразить его в окне. cameraMatrix
это коврик 3х3, который вы заполнили своей камерой. distCoeffs
обычно 1x4 или 1x5 Mat
содержащие коэффициенты искажения. (Обратите внимание, что p1 и p2 должны быть записаны сразу после k2).