2016-08-23 2 views
1

У меня есть изображение, в котором есть цель калибровки (известная геометрия) в сцене (скажем, простой квадрат 2 "x 2", лежащий на столе). Я хотел бы выполнить преобразование перспективы (используя warpPerspective()), чтобы получившееся изображение было ортогональным видом таблицы (как если бы ось камеры была параллельна нормальной таблице). Стандартная процедура вычисления гомографии от общей плоскости к другой общей плоскости, где по крайней мере 4 соответствия известны на двух изображениях одной и той же сцены (с использованием getPerspectiveTransform()). В этом случае, когда у меня есть только один образ, правильная вещь, чтобы сделать, чтобы просто «составить» плоскость и заставить соответствующие соответствия какой-либо произвольной позиции на этой плоскости? Например, в этой ситуации я просто делал бы соответствия между четырьмя обнаруженными углами (A, B, C, D) в изображении и четырьмя точками по своему выбору (которые по существу просто определяют реальный масштаб пикселя ->. , Я мог бы выбрать A '= (0,0), B' = (20,20), C '= (0,20), D' = (20,0), чтобы указать в полученном изображении 10 пикселей на Конечно, я мог бы выбрать любую шкалу здесь, и я мог бы также выбрать любую позицию для квадратной цели, чтобы приземлиться на выходе (т.е. A '= (100 100), B' = (120 120), C '= (100, 120), D '= (120, 100))Гомография от плоскости 3D до плоскости, параллельной плоскости изображения

Это правильный способ сделать это? Есть ли лучший способ вычислить проективное преобразование, которое смотрит прямо на плоскость, определенную набором точек в изображении, известном как быть в плоскости?

+0

Hi David! Да, я думаю, это правильно. По крайней мере, я сделал именно это, и все получилось очень неплохо. – Miki

+0

@Miki Спасибо! Просто убедившись, что я чего-то не пропустил, поскольку я не видел, чтобы кто-нибудь объяснял это где-то в Интернете, что всегда кажется странным. –

+1

Ах, ладно, кто-то объяснил это в конце концов :): «Перспективная коррекция с использованием гомографии» здесь http://www.learnopencv.com/homography-examples-using-opencv-python-c/ –

ответ

2

В этом случае, когда у меня есть только одно изображение, правильная вещь, чтобы сделать, чтобы просто «поднять» плоскость и заставить соответствующие соответствия какой-либо произвольной позиции на этой плоскости?

Да.

Обратите внимание, что в его нынешней реализации getPerspectiveTransform требует ровно 4 соответствия. Он находит перспективное преобразование 3x3, которое имеет 8 степеней свободы (элемент [3,3] фиксирован 1), поэтому ему нужны только 4 неколониумных соответствия, и таких соответствий будет достаточно. В отличие от этого, findHomography использует RANSAC для устранения неопределенности и может определить, какой из соответствий должен быть доверенным и которые являются выбросами. Если вы предпочитаете придерживаться линейных наименьших квадратов, вы можете принять getPerspectiveTransform, чтобы принять> = 4 пары.

Однако, если вы применяете перспективное преобразование, которое преобразует искаженную квадратную мишень T на идеальный квадрат, это будет делать только плоскости, которые являются компланарными с T также линейно-параллельными. Другие плоскости (например, перпендикулярно T) не будут линейно-параллельными после преобразования.

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

+0

a) В общем, Direct Метод Linear Transform может принимать любое количество * известных * соответствий и использовать их все для вычисления «наилучшей» матрицы в смысле наименьших квадратов (по сравнению с определением, какие соответствия обрабатывать как «действительные» с RANSAC) - это не то, что 'getPerspectiveTransform () 'делает? б) Преобразованное изображение будет «орфографическим» для точек на интересующей плоскости, верно? –

+0

(a) Да, 'getPerspectiveTransform' вычисляет линейное преобразование в смысле наименьших квадратов, но в его текущей реализации ему требуется ровно 4 соответствия. Было бы просто изменить его, чтобы принять любое число> = 4. См. Https://github.com/opencv/opencv/blob/b3b434e221b99a237b989cfbf90ffe6e6af6fab1/modules/imgproc/src/imgwarp.cpp#L6453 (b) Да. – szym