1.問題の説明:
観察画像面上で空間的に移動する物体のピクセル運動の瞬間速度は、画像シーケンスの時間領域でのピクセルの変化と隣接するフレーム間の相関を使用して、前のフレームと現在のフレーム、隣接するフレーム間のオブジェクトのモーション情報を計算するため。つまり、空間領域から画像平面への投影です。素人の言葉で言えば、画像内の各点の瞬間的な速度と方向を見つけることはオプティカルフローです。次に、最小二乗法を使用して、近傍のすべてのピクセルの基本的なオプティカルフロー方程式を解きます。方程式の数が未知数の数を超えているため、ピクセル位置pの周囲の領域がピクセルによって決定されると想定し、行列の形式で記述します。
2.プログラムの一部:
関数[u、v] = LucaKanade(im1、im2)
numLevels = 3;
window = 9;
反復= 1;
アルファ= 0.001;
hw = floor(window / 2);
pyramid1 = im1;
pyramid2 = im2;
for i = 2:numLevels
im1 = impyramid(im1、 'reduce');
im2 = impyramid(im2、 'reduce');
pyramid1(1:size(im1,1)、1:size(im1,2)、i)= im1;
pyramid2(1:size(im2,1)、1:size(im2,2)、i)= im2;
終わり;
for p = 1:numLevels
im1 = pyramid1(1:(size(pyramid1,1)/(2 ^(numLevels-p)))、1:(size(pyramid1,2)/(2 ^(numLevels-p)) )、(numLevels-p)+1);
im2 = pyramid2(1 :( size(pyramid2,1)/(2 ^(numLevels-p)))、1:(size(pyramid2,2)/(2 ^(numLevels-p)))、(numLevels-p )+1);
p == 1の場合
u = zeros(size(im1));
v = zeros(size(im1));
else
u = 2 * imresize(u、size(u)* 2、 'bilinear');
v = 2 * imresize(v、size(v)* 2、 'bilinear'); r = 1の
終了
:反復
u = round(u);
v = round(v);
for i = 1 + hw:size(im1,1)-hw
for j = 1 + hw:size(im2,2)-hw
patch1 = im1(i-hw:i + hw、j-hw:j + hw) ;
lr = i-hw + v(i、j);
hr = i + hw + v(i、j);
lc = j-hw + u(i、j);
hc = j + hw + u(i、j);
if(lr <1)||(hr> size(im1,1))||(lc <1)||(hc> size(im1,2))
else
patch2 = im2(lr:hr、lc:hc) ;
fx = conv2(patch1、0.25 * [-1 1; -1 1]、 'same')+ conv2(patch2、0.25 * [-1 1; -1 1]、 'same');
fy = conv2(patch1、0.25 * [-1 -1; 1 1]、 'same')+ conv2(patch2、0.25 * [-1 -1; 1 1]、 'same');
ft = conv2(patch1、0.25 * ones(2)、 'same')+ conv2(patch2、-0.25 * ones(2)、 'same');
Fx = fx(2:window-1,2:window-1) ';
Fy = fy(2:window-1,2:window-1) ';
Ft = ft(2:window-1,2:window-1) ';
A = [Fx(:) Fy(:)];
G = A '* A;
G(1,1)= G(1,1)+ alpha; G(2,2)= G(2,2)+ alpha;
U = 1 /(G(1,1)* G(2,2)-G(1,2)* G(2,1))* [G(2,2)-G(1,2);- G(2,1)G(1,1)] * A '*-Ft(:);
u(i、j)= u(i、j)+ U(1); v(i、j)= v(i、j)+ U(2);
エンド
エンド
エンド
エンド
エンド
エンド
3.シミュレーションの結論:
C-79