Я работаю над приложением, где мне нужно исправить изображение, взятое с платформы мобильной камеры. Платформа измеряет углы поворота, высоты тона и угла поворота, и я хочу, чтобы это выглядело так, будто изображение берется из непосредственно выше, каким-то образом преобразуется из этой информации.Преобразование изображения с использованием углов поворота-поворота (коррекция изображения)
Другими словами, я хочу идеальный квадрат, лежащий на земле, сфотографированный издалека с некоторой ориентацией камеры, чтобы преобразовать его, чтобы квадрат был совершенно симметричным впоследствии.
Я пытаюсь сделать это через OpenCV (C++) и Matlab, но, похоже, мне не хватает чего-то фундаментального в том, как это делается.
В Matlab, я попытался следующее:
%% Transform perspective
img = imread('my_favourite_image.jpg');
R = R_z(yaw_angle)*R_y(pitch_angle)*R_x(roll_angle);
tform = projective2d(R);
outputImage = imwarp(img,tform);
figure(1), imshow(outputImage);
Где R_z/у/х являются стандартными вращательными матрицы (реализован с градусами).
Для некоторых рыскания вращения, все это работает просто отлично:
R = R_z(10)*R_y(0)*R_x(0);
Что дает результат:
Если я пытаюсь повернуть изображение на ту же сумму около X- или Y-оси, я получаю следующие результаты:
R = R_z(10)*R_y(0)*R_x(10);
Однако, если я поворачиваюсь на 10 градусов, делясь на какое-то огромное количество, он начинает выглядеть нормально. Но опять же, это результат, который не имеет никакой ценности исследований, что так всегда:
R = R_z(10)*R_y(0)*R_x(10/1000);
Может кто-то пожалуйста, помогите мне понять, почему вращения вокруг осей X или Y-оси делает преобразование идти дикой природы ? Есть ли способ решить это без деления на случайное число и другие магические трюки? Возможно, это что-то, что можно решить с помощью параметров Эйлера? Любая помощь будет высоко оценена!
Update: Полная настройка и измерения
Для полноты, полный тестовый код и исходное изображение было добавлено, а также платформы углы Эйлера:
Код:
%% Transform perspective
function [] = main()
img = imread('some_image.jpg');
R = R_z(0)*R_y(0)*R_x(10);
tform = projective2d(R);
outputImage = imwarp(img,tform);
figure(1), imshow(outputImage);
end
%% Matrix for Yaw-rotation about the Z-axis
function [R] = R_z(psi)
R = [cosd(psi) -sind(psi) 0;
sind(psi) cosd(psi) 0;
0 0 1];
end
%% Matrix for Pitch-rotation about the Y-axis
function [R] = R_y(theta)
R = [cosd(theta) 0 sind(theta);
0 1 0 ;
-sind(theta) 0 cosd(theta) ];
end
%% Matrix for Roll-rotation about the X-axis
function [R] = R_x(phi)
R = [1 0 0;
0 cosd(phi) -sind(phi);
0 sind(phi) cosd(phi)];
end
Начальное изображение:
измерения платформы камеры в ТЕЛЕ координат:
Roll: -10
Pitch: -30
Yaw: 166 (angular deviation from north)
Из того, что я понимаю рыскания угол не имеет прямого отношения к трансформации. Возможно, я ошибаюсь.
Дополнительная информация:
Я хотел бы указать, что среда, в которой будет использоваться установка не содержит строк (океанические фото), которые могут надежно использоваться в качестве эталона (горизонт обычно не будет в картина). Также квадрат в исходном изображении просто используется как мера для проверки правильности преобразования и не будет присутствовать в реальном сценарии.
Не могли бы вы загрузить исходное изображение и реализацию матрицы вращения? – scap3y
Привет, Scap3y! Я добавил полный набор информации и код для проблемы в вышеприведенном сообщении. –
Хорошо, я думаю, вы пропустили важный шаг: найти гомографию по отношению к горизонтальным проекциям линий на изображении. Пожалуйста, обратитесь к [этой ссылке] (http://notbrainsurgery.livejournal.com/40465.html), чтобы получить представление о том, как заставить его работать. После того, как вы рассчитали гомографию, вы можете подключить ее вместо своей матрицы «R», и это должно сделать трюк. – scap3y