OpenCV обновить матрицу гомографии, чтобы соответствовать размеру изображения в два раза
Я делаю стабилизацию видео с помощью оптического потока. Чтобы заставить calcOpticalFlowPyrLK работать быстрее, я уменьшаю исходное изображение в 2 раза и запускаю функцию для этого.
Как я могу изменить матрицу гомографа (полученную с помощью findHomography), чтобы иметь возможность деформировать исходное, более крупное изображение.
2 ответа
Пусть B будет преобразованием, которое вы вычислили, вы можете умножить B на другую гомографию, A, чтобы получить AB = C, где C - это гомография, которая выполняет оба преобразования, это эквивалентно применению сначала B, а затем A. Чтобы найти A, вы можно использовать getPerspectiveTransform.
Редактировать: под AB я подразумевал матричное умножение, а не поэлементное умножение.
Редактировать 2: чтобы получить A, вы передаете четыре угла двух изображений в одном и том же порядке getPerspectiveTransform, так что углы изображения с пониженной дискретизацией являются исходными точками, а углы исходного изображения - точками назначения.
Это немного поздно, и ответ у вас отлично работает, но я хочу добавить одну вещь. Мне не нравится принимать такие функции, как getPerspectiveTransform как должное. В этом случае легко сделать матрицу самостоятельно. Уменьшение изображения в степени 2 легко. Предположим, у вас есть точка, и вы хотите переместить ее в изображение с двойным разрешением.
float newx = (oldx+.5)*2 - .5;
float newy = (oldy+.5)*2 - .5;
и наоборот, перейти к изображению с половиной разрешения...
float newx = (oldx+.5)/2 - .5;
float newy = (oldy+.5)/2 - .5;
Нарисуйте себе диаграмму, если вам нужно, и убедитесь, что она работает, запомните 0 индексацию. Вместо того чтобы думать о том, чтобы заставить ваше преобразование работать с другими разрешениями, подумайте о том, чтобы переместить каждую точку в разрешение вашего преобразования, затем использовать преобразование, а затем переместить его обратно. К счастью, вы можете сделать все это в 1 матрице, нам просто нужно построить эту матрицу! Сначала создайте матрицу для каждого из трех шагов
//move point to an image of half resolution, note it is equivalent to the above equation
project_down=(.5,0,-.25,
0,.5,-.25,
0, 0, 1)
//move point to an image of twice resolution, these are inverses of one another
project_up=(2,0,.5,
0,2,.5,
0, 0,1)
Чтобы сделать ваше окончательное преобразование просто объедините их
final_transform = [project_up][your_homography][project_down];
Приятно то, что вам нужно сделать это только один раз для любой гомографии. Это должно работать так же, как getPerspectiveTransform (и, вероятно, работать быстрее). Надеемся, что понимание этого поможет вам решить другие вопросы, с которыми вы можете столкнуться при изменении разрешения изображения.