OpenCV имеет функцииvaluRigidTransform () и warpAffine (), которые действительно хорошо справляются с подобными проблемами.
Это очень просто:
Mat M = estimateRigidTransform(frame1,frame2,0)
warpAffine(frame2,output,M,Size(640,480),INTER_NEAREST|WARP_INVERSE_MAP)
Теперь output
содержит содержимое frame2
, которое лучше всего выровнять, чтобы соответствовать frame1
.
Для больших сдвигов M будет нулевой матрицей или может не быть матрицей вообще, в зависимости от версии OpenCV, поэтому вам придется фильтровать их, а не применять их. Я не уверен, насколько это большое; может быть половина ширины кадра, может быть больше.
Третьим параметром для оценкиRigidTransform является логическое значение, которое сообщает ему, применять ли произвольную аффинную матрицу или ограничивать ее перемещением / вращением / масштабированием. В целях стабилизации изображения с камеры вы, вероятно, просто хотите последнюю. Фактически, для стабилизации изображения с камеры вы также можете удалить масштабирование из возвращенной матрицы, нормализовав его только для поворота и перемещения.
Кроме того, для движущейся камеры вы, вероятно, захотите взять M во времени и вычислить среднее значение.
Здесь приведены ссылки на дополнительную информацию о measureRigidTransform () и warpAffine ()