У меня есть следующее изображение I1. Я не захватил его. Я загрузил его из Google
Я применяю известную гомографию h к I1, чтобы получить следующее изображение I2.
Я хочу предположить, что камера сделала это над выстрелом I2. Я нашел матрицу камеры этой "камеры". Пусть эта матрица камеры k
. Теперь я хочу повернуть это изображение I2 относительно оси камеры. Согласно объяснению в принятом ответе в этом вопросе, мне нужно установить матрицу поворота R, а затем выполнить k*R*inv(k)*h
на изображении I1, чтобы получить требуемое повернутое изображение I3,
У меня возникли проблемы, когда я пытаюсь установить эту матрицу вращения R. Я использовал этот метод, чтобы установить матрицу R.
Чтобы проверить свой код, я сначала попытался повернуть изображение вокруг оси z на 10 градусов, но я не получил правильный вывод.
Мой частичный код Python:
theta_in_degrees = 10
theta_in_radians = theta_in_degrees*math.pi/180
ux=0.0
uy=0.0
uz=1.0
vector_normalize_factor = math.sqrt(ux*ux+uy*uy+uz*uz)
ux=ux/vector_normalize_factor
uy=uy/vector_normalize_factor
uz=uz/vector_normalize_factor
print "ux*ux+uy*uy+uz*uz = ", ux*ux+uy*uy+uz*uz
rotation_matrix = np.zeros([3,3])
c1 = math.cos(theta_in_radians)
c2 = 1-c1
s1 = math.sin(theta_in_radians)
rotation_matrix[0][0] = c1+ux*ux*c2
rotation_matrix[0][1] = ux*uy*c2-uz*s1
rotation_matrix[0][2] = ux*uz*c2+uy*s1
rotation_matrix[1][0] = uy*ux*c2+uz*s1
rotation_matrix[1][1] = c1+uy*uy*c2
rotation_matrix[1][2] = uy*uz*c2-ux*s1
rotation_matrix[2][0] = uz*ux*c2-uy*s1
rotation_matrix[2][1] = uz*uy*c2+ux*s1
rotation_matrix[2][2] = c1+uz*uz*c2
print "rotation_matrix = ", rotation_matrix
R = rotation_matrix
#Calculate homography H1 between reference top view and rotated frame
k_inv = np.linalg.inv(k)
Hi = k.dot(R)
Hii = k_inv.dot(h)
H1 = Hi.dot(Hii)
print "H1 = ", H1
im_out = cv2.warpPerspective(im_src, H1, (im_dst.shape[1],im_dst.shape[0]))
Здесь img_src
является источником I1.
Результат, который я получил, когда я попробовал вышеуказанный код, - это черное изображение без видимой части изображения. Однако, когда я изменил значение theta_in_degrees
на следующие значения, это были мои выходы:
0,00003
0.00006
0,00009
Почему вращение работает только для таких малых значений theta_in_degrees
? Кроме того, вращение, видимое на изображениях, фактически не происходит вокруг оси z. Почему изображение не вращается вокруг оси z? Где я ошибаюсь и как я могу исправить эти проблемы?
h matrix:
[[ 1.71025842e+00 -7.51761942e-01 1.02803446e+02]
[ -2.98552735e-16 1.39232576e-01 1.62792482e+02]
[ -1.13518150e-18 -2.27094753e-03 1.00000000e+00]]
k matrix:
[[ 1.41009391e+09 0.00000000e+00 5.14000000e+02]
[ 0.00000000e+00 1.78412347e+02 1.17000000e+02]
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
Edit:
После включения предложения Тоби Коллинза я установил верхнее левое значение k
таким же, как k[1][1]
. Когда я теперь выполняю вращение вокруг оси z, я получаю правильные повернутые изображения для всех значений theta_in_degrees
от 0 до 360. Однако, когда я пытаюсь повернуть изображение вокруг оси y, изменив ux, uy и uz в приведенном выше коде к следующему, я получаю абсурдные результаты вращения:
ux=0.0
uy=1.0
uz=0.0
Ниже приведены примеры для разных значений theta_in_degrees
и соответствующие результаты для вращения вокруг оси y:
-10
-40
-90
-110
Где я все еще ошибаюсь? Кроме того, почему существует такое огромное падение длины и ширины последовательных желтых полос во вращающемся изображении? И почему часть изображения обтекает (например, результаты вращения на -90 и -110 градусов)?
Вторая часть моего вопроса такова: векторное уравнение моей оси вращения (320, 0, -10)+t(0, 1, 0)
. Чтобы использовать этот метод, чтобы вычислить матрицу вращения, мне нужно определить ux
, uy
и uz
ось поворота такая, что ux^2+uy^2+uz^2=1
. Это было бы просто, если поворот необходимо сделать вокруг одной из осей координат (как я сейчас делаю для целей тестирования). Но как мне получить эти значения ux
, uy
и uz
, если переменная t
в векторном уравнении моей оси вращения является переменной? Я также открыт для предложений относительно любых других подходов к поиску подходящей матрицы поворота R, так что вращение происходит вокруг упомянутой оси (например, x градусов).