Исправьте изображение с помощью cameraParams Matlab (Computer Vision System Toolbox)

Я работаю над рабочим процессом PIV и в настоящее время предварительно обрабатываю изображения. Мне нужно избавиться от искажения перспективы на изображениях. У меня есть «набор инструментов для обработки изображений» и «калибратор камеры». Я уже избавился от дисторсии объектива с помощью "undistortImage();" и объект cameraParams, который выводится с помощью шаблона шахматной доски.

Первый вопрос: можно ли использовать объект cameraParams для искажения изображения в перспективе, чтобы моя шахматная доска была выпрямлена на изображении?

Второй вопрос: поскольку я не мог использовать объект cameraParams, я попытался использовать функции преобразования вручную. Я попытался использовать пары контрольных точек (с инструментом cpselection, исходное изображение и сгенерированное изображение шахматной доски) и fitgeotrans (movingPoints, fixedPoints, 'projective'); функция для получения моего объекта tform. Однако я всегда получаю сообщение об ошибке:

Error using fitgeotrans>findProjectiveTransform (line 189)
At least 4 non-collinear points needed to infer projective transform.
Error in fitgeotrans (line 102)
        tform = findProjectiveTransform(movingPoints,fixedPoints);

Я пробовал много разных пар контрольных точек (4 пары и более). Но я все еще получаю эту ошибку. Я считаю, что я должен упустить что-то здесь.

Любая помощь приветствуется, спасибо.

Стефан


person Stephan    schedule 02.12.2014    source источник
comment
первый вопрос: Единственная, единственная причина получения cameraParams — это убрать изображение. Поэтому это не только возможно, но и обязательно. Во-вторых: похоже, точки, которые вы указываете, лежат на одной линии, и они должны быть не коллинеарны!   -  person Ander Biguri    schedule 02.12.2014
comment
Спасибо. 1.: Да, я тоже так думал. Чтобы получить искажение объектива, Matlab должен выполнить некоторые внутренние коррекции перспективы. Однако я не могу найти способ применить эту коррекцию к изображению. undistortImage() просто выполняет коррекцию объектива. 2.: Мои точки расположены в виде прямоугольника или ромба, то есть не в линию. Так что эта ошибка меня немного смущает...   -  person Stephan    schedule 02.12.2014


Ответы (1)


Если вы используете одно из калибровочных изображений, то вся необходимая вам информация содержится в объекте cameraParams.

Допустим, вы используете калибровочное изображение 1 и назовем его I. Во-первых, неискажать изображение:

I = undistortImage(I, cameraParams);

Получите внешние данные (поворот и перевод) для вашего изображения:

R = cameraParams.RotationMatrices(:,:,1);
t = cameraParams.TranslationVectors(1, :);

Затем объедините вращение и перенос в одну матрицу:

R(3, :) = t;

Теперь вычислите гомографию между шахматной доской и плоскостью изображения:

H = R * cameraParams.IntrinsicMatrix;

Преобразуйте изображение, используя обратную гомографию:

J = imwarp(I, projective2d(inv(H)));
imshow(J);

Вы должны увидеть шахматную доску с высоты птичьего полета. Если вы не используете одно из калибровочных изображений, вы можете вычислить R и t с помощью функции extrinsics.

Другой способ сделать это — использовать detectCheckerboardPoints и generateCheckerboardPoints, а затем вычислить гомографию, используя fitgeotform.

person Dima    schedule 02.12.2014
comment
Большое Вам спасибо. Я только что попробовал это, и это работает как шарм. Пальцы вверх! - person Stephan; 05.12.2014