Мне нужно вычислить матрицу деформаций в OpenCV, представляющую поворот вокруг данной оси.Повернуть изображение вокруг оси x, y, z в OpenCV
вокруг оси Z -> проста: я использую стандартную матрицу вращения
[cos(a) -sin(a) 0]
[sin(a) cos(a) 0]
[ 0 0 1]
Это не столь очевидно для других поворотов, так что я пытался строить гомография, как описано в Википедии:
H = R - t n^T/d
Я пробовал с простым вращением вокруг оси X, и предполагая, что расстояние между камерой и изображением вдвое превышает высоту изображения.
R является стандартной матрицей вращения
[1 0 0]
[0 cos(a) -sin(a)]
[0 sin(a) cos(a)]
п [0 0 1]
, потому что камера смотрит прямо на изображении, из (0, 0, z_cam)
т является переводом, который должен быть [0 -2h*(sin(a)) -2h*(1-cos(a))]
d - расстояние, и оно составляет 2 часа за определение.
Таким образом, окончательная матрица:
[1 0 0]
[0 cos(a) 0]
[0 sin(a) 1]
, который выглядит довольно хорошо, когда а = 0 это тождество, а при а = р это отражается вокруг оси х.
И все же, использование этой матрицы для перспективной деформации не дает ожидаемого результата, изображение просто «слишком искажено» для небольших значений a и очень быстро исчезает.
Итак, что я делаю неправильно?
(примечание: Я прочитал много вопросов и ответов на эту тему, но все они идут в противоположном направлении: Я не хочу, чтобы разлагаются матрицу гомография, а скорее построить один, учитывая трехмерное преобразование и «фиксированная» камера или фиксированное изображение и движущаяся камера).
спасибо.
Как вы установили свою систему координат? – Michele
(0,0) - верхний левый, x = colum, y = row. В принципе, изображение загружается с использованием cv :: imread, и никаких преобразований не применяется. –
Я думаю, вы должны использовать представление по оси, а затем экспоненциальную карту, чтобы получить свою матрицу вращения [см. Эту ссылку для краткого объяснения] (http://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation) – Michele