% Estimation du mouvement par technique de BlockMatching
%
% %seq = aviread('foreman_color_qcif.avi');
% % Rq0 : aviread remplac?e par VideoReader dans Matlab R20015a
% % Rq2 : Impossible de lire la s?quence 'foreman' avec VideoReader (??)
%
% vidObj = VideoReader('Vectra21Frames.mpg');
% chargement de la sequence
%vidHeight = vidObj.Height;
%vidWidth = vidObj.Width;
vidHeight = 176;
vidWidth = 320;
% seq = struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'), ...
% 'colormap', []);
%
% k = 1;
% while hasFrame(vidObj)
% seq(k).cdata = readFrame(vidObj);
% k=k+1;
% end
% % Affichage de la sequence
% figure (1);
% movie(seq);
% Affichage des 2 images successives
im1 = imread('im1.ppm');
im2 = imread('im2.ppm');
% Affichage des 2 images
figure;
imshow(im1);
figure;
imshow(im2);
% Conversion : RGB -> YUV et conservation du Y
YCBCR1 = rgb2ycbcr(im1);
YCBCR2 = rgb2ycbcr(im2);
Y1 = double( YCBCR1(:, :, 1) ); % la luminance de la référence : Y(t-1)
Y2 = double( YCBCR2(:, :, 1) ); % la luminance de la cible : Y(t)
% Prendre une portion des images => moins de calcul
% Rq : Prendre des dimensions modulo taille du bloc (c.a.d 8)
Y1 = Y1(1:120, 81:160);
Y2 = Y2(1:120, 81:160);
[nblignes, nbcolonnes] = size( Y1 );
% Definition de la fonction MSE
MSE = @(x1, x2) mean2((x1 - x2).^2);
% Boucle sur les blocs "b" de la cible Y(t) soit ici Y2
% => tenir compte de l'effet de bord
% (t.q fenetre de recherche toujours incluse dans la reference
% Y(t-1) soit ici Y1)
% ("enlever" 8 lignes et 8 colonnes autour de Y2)
% Pour le resultat : affichage des vecteurs en sur-impression sur Y2
figure(2);
imshow( uint8( Y2 ) );
for i = 9 : 8 : nblignes-9
for j = 9 : 8 : nbcolonnes-9
% prelevement de b
b = Y2(i:i+7, j:j+7);
% prelevement de la fenetre de recherche "B" dans la reference
% Y(t-1) soit ici Y1
B = Y1(i-8:i+7, j-8:j+7);
% calcul des EQM
% Rq : nlfilter procède sur chacun de blocs (8x8) de B et en
% les recouvrant
EQM = nlfilter(B, [8 8], MSE, b);
% retenir EQM minimale
EQM_min = min( min( EQM ));
% position des éléments présentants le min dans EQM
% Rq : si impressionl y en a plusieurs, on prendra la 1ere occurence
[I, J] = find( EQM == EQM_min );
% affichage du vecteur mouvement en sur-impression dans Y2
hold on;
X = [ i+4 i+I(1)-4 ];
Y = [ j+4 j+J(1)-4 ];
%line(X, Y);
line(Y,X)
end
end