Тестирование количества выбросов 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 с C ++.

1

Решение

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

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

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)

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

0

Другие решения

Там есть новая функция под названием «findTransformsECC», чтобы найти аффинную матрицу деформации Transform между двумя картинками, http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc

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

0