单应性矩阵MATLAB程序

       单应性(Homography)描述的是同一个平面上的点,在两幅视图上的像点之间存在一一对应的映射关系,本质上是将一个目标点在两幅图像中相互转移。对应关系如图所示。

    本文计算单应性矩阵在两个图像平面中都需要选择四个点,选点程序如下:

%单应矩阵 选点
clear
clc;
image1=imread('firstView000000.jpg');
image2=imread('secondView000000.jpg');
figure(1);
imshow(image1);
[xx,yy]=ginput(4);
figure(2);
imshow(image2);
[xa,ya]=ginput(4);
P1=[xx(1) yy(1);
    xx(2) yy(2);
    xx(3) yy(3);
    xx(4) yy(4)];
P2=[xa(1) ya(1);
    xa(2) ya(2);
    xa(3) ya(3);
    xa(4) ya(4)];
Point_H=[P1,P2];

H_Initial.img1=image1;
H_Initial.img2=image2;
H_Initial.Point=Point_H;
save H.mat H_Initial;

计算单应性矩阵H,并测试程序如下:

clear;clc;
load H;
H_Initial.img1=imread('firstView000300.jpg');
H_Initial.img2=imread('secondView000300.jpg');


P1=H_Initial.Point(:,1:2);P2=H_Initial.Point(:,3:4);
H = CalcH(P1, P2);

% 测试单应性矩阵

figure(1);imshow(H_Initial.img1);hold on;plot(P1(:,1),P1(:,2),'r.');
[P11x, P11y] = ginput(1);
P11 = [P11x, P11y];hold on;plot(P11(1),P11(2),'gp','MarkerSize', 12);
% 计算1中的点在2中对应的单应性点
P22 = WarpH(P11,H);
figure(2)
imshow(H_Initial.img2);hold on;plot(P2(:,1),P2(:,2),'r.');
hold on;
plot(P22(1), P22(2), 'gp', 'MarkerSize', 12);


% 所需子函数
function H = CalcH(P1, P2)
x = P1(:, 1);
y = P1(:, 2);
X = P2(:, 1);
Y = P2(:, 2);
A = zeros(length(x(:))*2,9);
for i = 1:length(x(:)),
    a = [x(i),y(i),1];
    b = [0 0 0];
    c = [X(i);Y(i)];
    d = -c*a;
    A((i-1)*2+1:(i-1)*2+2,1:9) = [[a b;b a] d];
end
[U S V] = svd(A);
h = V(:,9);
H = reshape(h,3,3)';
end
% 子函数
function P2 = WarpH(P1, H);
x = P1(:, 1);
y = P1(:, 2);
p1 = [x'; y'; ones(1, length(x))];
q1 = H*p1;
q1 = q1./[q1(3, :); q1(3,:); q1(3, :)];

P2 = q1';
end

测试结果如下:

 

完。如有错误之处请指正。

 

 

 

 

  • 10
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值