基于matlab的imtransform在图像和标记矩形上的应用

基于matlab的imtransform在图像和标记矩形上的应用,matlab,transformation,homography,projective-geometry,Matlab,Transformation,Homography,Projective Geometry,我试图在一个图像和一个标记的矩形上应用投影单应。我的解决方案适用于所有仿射变换,但在投影变换的情况下,当我在循环中运行它时,系统误差会不断增加。我似乎想不出原因。如果您能快速回答,我们将不胜感激。请查看代码和屏幕截图。谢谢 clc;clear;close all; background_img_dir = 'D:/eyedeus/dataset/background_imgs/'; background_img = [background_img_dir '1.jpg']; img = imr

我试图在一个图像和一个标记的矩形上应用投影单应。我的解决方案适用于所有仿射变换,但在投影变换的情况下,当我在循环中运行它时,系统误差会不断增加。我似乎想不出原因。如果您能快速回答,我们将不胜感激。请查看代码和屏幕截图。谢谢

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
带有标记的蓝色矩形的第一幅图像:

应用单应后:


看起来像是单应性的分割步骤中的排版。与此相反:

pts = H * x;
pts = pts(1:2, :) ./ repmat(x(3,:),2,1);
你想要这个:

pts = H * x;
pts = pts(1:2, :) ./ repmat(pts(3,:),2,1);

不起作用,我知道imtransform中单应矩阵的表示法有差异,我搞不懂,这就是为什么规范化不起作用,没有规范化结果会有点偏差,规范化会很奇怪。好吧,还有一个想法:指定UData和VData,因此,在变换之前,图像坐标将在0和1之间重新缩放。在变换之前,您可能需要按图像的宽度和高度重新缩放矩形坐标,然后在变换之后再次恢复到像素。@Peter您能检查一下这个吗?Ali,您知道如何在x轴上应用单应吗?请检查我的