Я использую 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 ++.
Отвечая на мой собственный вопрос, я действительно нашел способ сделать это. Я не уверен, что это лучший способ сделать это, но, похоже, он работает нормально, основываясь на тестах, которые я делал до сих пор.
Как объяснено здесь
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)
Я не уверен, что это самый эффективный способ сделать это, поэтому, если у кого-то есть лучшее предложение, пожалуйста, оставьте комментарий!
Там есть новая функция под названием «findTransformsECC», чтобы найти аффинную матрицу деформации Transform между двумя картинками, http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc
Я думаю, что это доступно в Opencv 3.0 +