Тестирование количества выбросов opencv warpAffine

Я использую opencv для оценки аффинного преобразования между двумя изображениями (назовем его A и B, и я хочу оценить от A до B), и мне нужно реализовать RANSAC, чтобы получить наилучшую возможную оценку. На данный момент моя структура для RANSAC (учитывая, что у меня уже есть ключевые точки для обоих изображений и совпадений между ними):

1: Выберите 3 случайных совпадения и используйте совпадающие точки из A и B в качестве входных данных для функции getAffineTransform;

2: Используйте функцию warpAffine, чтобы деформировать точки из A и сравнить результаты с точками B., получив скорость выбросов: e;

3: Учитывая, что размер моей выборки составляет 3 балла (getAffineTransform требуется 3 балла, чтобы найти преобразование) и у меня есть частота выбросов e, я могу найти количество раз, которое мне нужно запускать RANSAC, чтобы иметь высокую вероятность найти хорошая оценка, N раз;

4: повторите шаги 1 и 2 N раз, сохраняя преобразование с наименьшей частотой выбросов;

Хотя основная идея кажется хорошей, у меня возникли проблемы с выполнением, особенно с шагом 2. Моя проблема в том, что я не уверен, как я могу проверить количество выбросов. Я думал о сопоставлении точек A с B с помощью warpAffine, но я почти уверен, что это не сработает, потому что я считаю, что функция будет интерпретировать мой мат точек (который представляет собой мат Mx2, где M - количество точек, а каждый столбец координаты x и y точки) в качестве изображения вместо набора точек, которые я хочу отобразить. Как я могу это сделать?

Я использую opencv 2.4.2 с С++.


person Alberto A    schedule 07.09.2012    source источник


Ответы (2)


Отвечая на свой вопрос, я действительно нашел способ сделать это. Я не уверен, что это лучший способ сделать это, но, судя по тестам, которые я провел до сих пор, он работает нормально.

Как объяснено здесь

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html#warp-affine,

Аффинное преобразование — это преобразование, которое можно выразить как произведение матриц. Итак, применение преобразования состоит в простом умножении моих точек на матрицу, которую я получаю от getAffineTransform. Перед отображением одной точки нам нужно добавить «1» к точке, которую нужно нанести на карту, и транспонировать ее (так что у нас есть вектор-столбец), а затем сопоставить, умножив ее на матрицу преобразования. Мы можем легко расширить это отображение для каждой точки, если мы преобразуем матрицу точек Mx2 в матрицу точек 3xM формы:

|x1, x2, x3, ...., xM|
|y1, y2, y3, ...., yM|
| 1,  1,  1, ....,  1|

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

Кроме того, чтобы добавить этот вектор из единиц и транспонировать его, я делаю следующее:

1 - Create a new 3 x M matrix consisting of ones with Mat::ones, named newPtMat
2 - transpose my original point matrix, and keep it in a temp Mat
3 - use temp.copyTo(newPtMat.rowRange(0, 2)

Я не уверен, что это самый эффективный способ сделать это, поэтому, если у кого-то есть лучшее предложение, оставьте комментарий!

person Alberto A    schedule 08.09.2012

Доступна новая функция под названием "findTransformsECC" для поиска матрицы деформации аффинного преобразования между двумя изображениями, http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc

Я думаю, что это доступно в Opencv 3.0 +

person Kev1n91    schedule 02.09.2016