script4

Contents

clear
close all
load pts1
rgb = imread(filename);
% rgb = imresize(rgb,0.25);

starting image

kp(1,:) = pts(1,:) - pts(2,:);
kp(2,:) = pts(3,:) - pts(4,:);
for k=1:2
    kp(k,:) = kp(k,:)/norm(kp(k,:));
end
s = det(kp(1:2,:));
s = asin(s)*180/pi;
str = sprintf('divergence %g deg',s);
disp(str);
imshow(rgb);
hold on
plot(pts(1:2,1),pts(1:2,2),'b','LineWidth',2);
plot(pts(3:4,1),pts(3:4,2),'b','LineWidth',2);
hold off
title(str);
divergence -75.0002 deg
Warning: Image is too big to fit on
screen; displaying at 25% 

find zero divergence

KK = [6500 0 0; 0 6500 0; 2000 1000 1];
clear ang dang
ang(1) = -60;
ang(2) = ang(1)-1;
dang(1) = div_angle(ang(1),pts,KK);
dang(2) = div_angle(ang(2),pts,KK);

for k=1:5
    q = -dang(1)/(dang(2)-dang(1));
    anew = ang(1)+(ang(2)-ang(1))*q;
    dang(1) = dang(2);
    ang(1) = ang(2);
    ang(2) = anew;
    dang(2) = div_angle(ang(2),pts,KK);
    if abs(dang(2))<1e-6
        break;
    end
end

[da,tf] = div_angle(anew,pts,KK);
str = sprintf('angle %g deg   divergence %g deg',anew,da);

[x, y] = transformPointsForward(tf,pts(:,1),pts(:,2));
pts2 = [x y];
angle -60 deg   divergence -32.0416 deg
angle -61 deg   divergence -30.7132 deg
angle -84.1202 deg   divergence 3.52504 deg
angle -81.7398 deg   divergence -0.165754 deg
angle -81.8467 deg   divergence -1.1049e-05 deg
angle -81.8467 deg   divergence 3.33715e-10 deg

wide view

ymax = max(y);
% vary spread to change extent of image
spread = 20000;
xrng = [min(x)-spread max(x)+spread];
diff = xrng(2)-xrng(1);
yrng = [ymax-diff ymax];
myref = imref2d([800 800],xrng,yrng);
[img, ref] = imwarp(rgb,tf,'OutputView',myref,'FillValues',[255 255 200]);
imshow(img);
ref

[xp, yp] = worldToIntrinsic(myref,x,y);
hold on
plot(xp(1:2),yp(1:2),'b','LineWidth',2);
plot(xp(3:4),yp(3:4),'b','LineWidth',2);
hold off
title(str);
ref = 

  imref2d with properties:

           XWorldLimits: [-2.2334e+04 2.8735e+04]
           YWorldLimits: [-6.6408e+04 -1.5338e+04]
              ImageSize: [800 800]
    PixelExtentInWorldX: 63.8372
    PixelExtentInWorldY: 63.8372
    ImageExtentInWorldX: 5.1070e+04
    ImageExtentInWorldY: 5.1070e+04
       XIntrinsicLimits: [0.5000 800.5000]
       YIntrinsicLimits: [0.5000 800.5000]

narrow view

ymax = max(pts2(:,2));
spread = 2000;
xrng = [min(pts2(:,1))-spread max(pts2(:,1))+spread];
diff = xrng(2)-xrng(1);
yrng = [ymax-diff ymax];

myref = imref2d([800 800],xrng,yrng);
[img, ref] = imwarp(rgb,tf,'OutputView',myref,'FillValues',[255 255 200]);
imshow(img);

% pts3 = pts2;
% pts3(2,:) = pts2(1,:) + 0.5*(pts2(2,:)-pts2(1,:));

[xp, yp] = worldToIntrinsic(myref,pts2(:,1),pts2(:,2));
hold on
plot(xp(1:2),yp(1:2),'b','LineWidth',2);
plot(xp(3:4),yp(3:4),'b','LineWidth',2);
hold off

title(str);
ref
ref = 

  imref2d with properties:

           XWorldLimits: [-4.3344e+03 1.0735e+04]
           YWorldLimits: [-3.0408e+04 -1.5338e+04]
              ImageSize: [800 800]
    PixelExtentInWorldX: 18.8372
    PixelExtentInWorldY: 18.8372
    ImageExtentInWorldX: 1.5070e+04
    ImageExtentInWorldY: 1.5070e+04
       XIntrinsicLimits: [0.5000 800.5000]
       YIntrinsicLimits: [0.5000 800.5000]