Применение гомографии к изображению и выделенному прямоугольнику с помощью imtransform в matlab
Я пытаюсь нанести проекционную гомографию на изображение и помеченный прямоугольник. Мое решение хорошо работает для всех аффинных преобразований, но в случае проективных преобразований есть систематическая ошибка, которая постоянно увеличивается, когда я запускаю его в цикле. Я не могу понять причину. Быстрый ответ будет очень признателен. пожалуйста, посмотрите на код и снимки экрана. Спасибо
clc;clear;close all;
background_img_dir = 'D:/eyedeus/dataset/background_imgs/';
background_img = [background_img_dir '1.jpg'];
img = imread('D:/workspace/dataset/taj.jpg');
rect = [236 333 325 226; 304 303 441 440];
K = eye(3);
steps=pi/100; ang=-steps;
rotaxis=[0.5,0.5,1]; rotaxis=rotaxis./norm(rotaxis);
N = 100;
for i = 1:N
ang=ang+steps;
R=makehgtform('axisrotate',rotaxis,ang);
H = K * R(1:3,1:3) * inv(K);
Hp = H';
T = maketform('projective', Hp);
xsize=size(img,1);
ysize=size(img,2);
t_img = imtransform(img, T, 'UData',[0 1],'VData',[0 1]);
x = [rect ; ones(1,4)];
pts = H * x;
pts = pts(1:2, :) ./ repmat(x(3,:),2,1);
clf;
imshow(t_img); hold on;
line([pts(1,:) pts(1,1)], [pts(2,:) pts(2,1)], 'color', 'b', 'LineWidth', 2);
pause(0.1);
end
Первое изображение с отмеченным синим прямоугольником:
После применения гомографии:
1 ответ
Похоже на опечатку на этапе деления гомографии. Вместо этого:
pts = H * x;
pts = pts(1:2, :) ./ repmat(x(3,:),2,1);
Вы хотите это:
pts = H * x;
pts = pts(1:2, :) ./ repmat(pts(3,:),2,1);