126 lines
2.6 KiB
Matlab
126 lines
2.6 KiB
Matlab
% Source:
|
|
% http://www.johnloomis.org/ece564/notes/tform/planar/html/planar2.html
|
|
%
|
|
%% Produce orthonormal view from oblique projective image
|
|
% read original image
|
|
%
|
|
clear; close all
|
|
filename = 'floor640x480.jpg';
|
|
img = im2double(rgb2gray(imread(filename)));
|
|
name = 'check2';
|
|
msgid = 'Images:initSize:adjustingMag';
|
|
warning('off',msgid);
|
|
imshow(img);
|
|
%
|
|
%%
|
|
%
|
|
% input corners (using impixel) and compute transform
|
|
%[c r p] = impixel;
|
|
c = [ 320 639 639 320 ]'; % x
|
|
r = [ 60 1 479 390 ]'; % y
|
|
base = [0 0; 159 0; 159 239; 0 239]; % output dimentions
|
|
tf = fitgeotrans([c r],base,'projective');
|
|
disp('tf = ');
|
|
disp(tf)
|
|
%
|
|
%%
|
|
%
|
|
T = tf.T;
|
|
disp('T =');
|
|
format short g
|
|
disp(T);
|
|
disp('After rounding and converting ');
|
|
T = round(T * 2^12) / 2^12
|
|
format
|
|
%
|
|
%% overlay control points on image
|
|
%
|
|
imshow(img);
|
|
hold on;
|
|
plot([c;c(1)],[r;r(1)],'r','Linewidth',2);
|
|
%text(c(1),r(1)+20,'0, 11','Color','y');
|
|
%text(c(2),r(2)+20,'11, 11','Color','y');
|
|
%text(c(3),r(3)-20,'11, 0','Color','y');
|
|
%text(c(4),r(4)-20,'0, 0','Color','y');
|
|
hold off;
|
|
F = getframe();
|
|
g = frame2im(F);
|
|
imwrite(g,[name '_overlay.jpg']);
|
|
%
|
|
%% do image transform
|
|
%
|
|
[xf1, xf1_ref] = imwarp(img,tf);
|
|
imshow(xf1)
|
|
xf1_ref
|
|
imwrite(xf1,[name '_registered.jpg']);
|
|
|
|
%% Crop image - added not in original code file
|
|
%
|
|
% xf2 = imcrop(xf1,[476 118 240 240]);
|
|
% imshow(xf2)
|
|
% imwrite(xf2,[name '_croped.jpg']);
|
|
|
|
%% Print perspective trasform matrix values in hex
|
|
Thex = [];
|
|
for i=1:3
|
|
for k=1:3
|
|
a = sfi(T(i,k),25,12);
|
|
Thex = [Thex; a.hex];
|
|
end
|
|
end
|
|
Thex,
|
|
|
|
%% Calculatin w values
|
|
w= [];
|
|
w_inv= [];
|
|
table = [];
|
|
P= [];
|
|
Pnew= [];
|
|
for x=320:639
|
|
for y=0:480
|
|
P = [ x , y, 1] * T;
|
|
w = [w ; P(3)];
|
|
w_inv = [w_inv; 1/P(3) ];
|
|
table = [ table; P(3) , 1/P(3) ];
|
|
Pnew= [ Pnew ; floor(P(1)/P(3)), floor(P(2)/P(3)) ];
|
|
end
|
|
end
|
|
w = unique(w);
|
|
w_inv = unique(w_inv);
|
|
min(w),
|
|
max(w),
|
|
min(w_inv),
|
|
max(w_inv),
|
|
|
|
%% % make fale for case statement in Verilog
|
|
|
|
w_dec = [];
|
|
%w_hex = [];
|
|
w_dec_inv = [];
|
|
temp = ['0000000000'];
|
|
temp_old = ['0000010000'];
|
|
for i=1:0.001:2.999
|
|
w_dec = [ w_dec; ufi(i,10,8)];
|
|
w_dec_inv = [ w_dec_inv; ufi(1/i,10,8)];
|
|
end
|
|
%w_hex = w_dec.hex;
|
|
w_bin = w_dec.bin;
|
|
w_bin_inv = w_dec_inv.bin;
|
|
|
|
fid = fopen('lookuptable.txt', 'wt');
|
|
fprintf(fid, 'case (w)\n');
|
|
|
|
for i=1:length(w_bin)
|
|
temp_old = temp;
|
|
temp = w_bin(i,1:10);
|
|
if temp_old == temp
|
|
|
|
else
|
|
fprintf(fid, '\t10''b%s : r_w_inv <= 10''b%s;\n', w_bin(i,1:10), w_bin_inv(i,1:10) );
|
|
end
|
|
end
|
|
fprintf(fid, '\tdefault : r_w_inv <= 10''b%s;\n ', w_bin(1,1:10) );
|
|
fprintf(fid, 'endcase; ');
|
|
disp('Text files write done');disp(' ');
|
|
fclose(fid);
|