📄 camshift.mht
字号:
From: <由 Microsoft Internet Explorer 5 保存>
Subject:
Date: Tue, 26 Jun 2007 15:57:58 +0800
MIME-Version: 1.0
Content-Type: text/html;
charset="gb2312"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://bbs.matwav.com/user/download/167359/camshift.m
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dgb2312">
<META content=3D"MSHTML 6.00.2900.3086" name=3DGENERATOR></HEAD>
<BODY><PRE>% Adam Kukucka
% Zach Clay
% Marcelo Molina =20
% CSE 486 Project 3
function [ trackmov probmov centers ] =3D camshift=20
% ******************************************************************
% initialize vari ables
% ******************************************************************
rmin =3D 0; %min row value for search window
rmax =3D 0; %max row value for search window
cmin =3D 0; %min col value for search window
cmax =3D 0; %max col value for search window
numofframes =3D 0; %number of frames in the avi
threshold =3D 1; %threshold for convergence
centerold =3D [0 0]; %for convergence... previous center of window
centernew =3D [0 0]; %for convergence... new center of window
% ******************************************************************
% Pre code... load movie and select initial frame
% ******************************************************************
% prompt user for avi file name
user_entry =3D input('Please enter an avi filename: ','s');
% load the avi file... handle is M=20
M =3D aviread(user_entry);
% get number of frames
[dontneed numberofframes] =3D size(M);
% initialize matrix to hold center coordinates
imagecenters =3D zeros(numberofframes, 2);
% extract the first frame from the avi
Frame1 =3D M(1,1);
Image1 =3D frame2im(Frame1);
%%% ********** images(:, :, numberofframes) =3D G(:,:);
% get search window for first frame
[ cmin, cmax, rmin, rmax ] =3D select( Image1 );
cmin =3D round(cmin);
cmax =3D round(cmax);
rmin =3D round(rmin);
rmax =3D round(rmax);
wsize(1) =3D abs(rmax - rmin);
wsize(2) =3D abs(cmax - cmin);
% create histogram
% translate to hsv
hsvimage =3D rgb2hsv(Image1);
% pull out the h
huenorm =3D hsvimage(:,:,1);
% scale to 0 to 255
hue =3D huenorm*255;
% set unit type
hue=3Duint8(hue);
% Getting Histogram of Image:
histogram =3D zeros(256);
for i=3Drmin:rmax
for j=3Dcmin:cmax
index =3D uint8(hue(i,j)+1); =20
%count number of each pixel
histogram(index) =3D histogram(index) + 1;
end
end
% ******************************************************************
% Algorithm from pdf
% ******************************************************************
% for each frame
for i =3D 1:99
disp('Processing frame');
disp(i);
Frame =3D M(1, i);
I =3D frame2im(Frame);
=20
% translate to hsv
hsvimage =3D rgb2hsv(I);
% pull out the h
huenorm =3D hsvimage(:,:,1);
% scale to 0 to 255
hue =3D huenorm*255;
% set unit type
hue=3Duint8(hue);
=20
=20
=20
[rows cols] =3D size(hue);
=20
% choose initial search window
% the search window is (cmin, rmin) to (cmax, rmax)
=20
=20
% create a probability map
probmap =3D zeros(rows, cols);
for r=3D1:rows
for c=3D1:cols
if(hue(r,c) ~=3D 0)
%=B3=F6=CF=D6=B5=C4=B8=C5=C2=CA=B4=F3=D0=A1
probmap(r,c)=3D histogram(hue(r,c)); =20
end
end =20
end
probmap =3D probmap/max(max(probmap));
probmap =3D probmap*255;
=20
count =3D 0;
=20
rowcenter =3D 0; % any number just so it runs through at least =
twice
colcenter =3D 0;
rowcenterold =3D 30;
colcenterold =3D 30;
% Mean Shift for 15 iterations or until convergence(the center =
doesnt
% change)
while (((abs(rowcenter - rowcenterold) > 2) && =
(abs(colcenter - colcenterold) > 2)) || (count < 15) )
%for j =3D 1:5
%disp('meanshift');
% disp(j);
rmin =3D rmin - 7; %increase window size and check for center
rmax =3D rmax + 7;
cmin =3D cmin - 7;
cmax =3D cmax + 7;
=20
rowcenterold =3D rowcenter; %save old center for convergence =
check
colcenterold =3D colcenter;
=20
[ rowcenter colcenter M00 ] =3D meanshift(I, rmin, rmax, =
cmin,...
cmax, probmap);
% given image (I), search window(rmin rmax cmin cmax)
% returns new center (colcenter, rowcenter) for window and=20
% zeroth moment (Moo)
=20
% redetermine window around new center
rmin =3D round(rowcenter - wsize(1)/2);
rmax =3D round(rowcenter + wsize(1)/2);
cmin =3D round(colcenter - wsize(2)/2);
cmax =3D round(colcenter + wsize(2)/2);
wsize(1) =3D abs(rmax - rmin);
wsize(2) =3D abs(cmax - cmin);
=20
count =3D count + 1;
end
=20
% mark center on image =20
=20
%save image
G =3D .2989*I(:,:,1)...
+.5870*I(:,:,2)...
+.1140*I(:,:,3);
trackim=3DG;
=20
%make box of current search window on saved image
for r=3D rmin:rmax
trackim(r, cmin) =3D 255;
trackim(r, cmax) =3D 255;
end
for c=3D cmin:cmax
trackim(rmin, c) =3D 255;
trackim(rmax, c) =3D 255;
end
=20
%create image movie, and probability map movie
trackmov(:,:,i)=3D trackim(:,:);
probmov(:,:,i) =3D probmap(:,:);
=20
% save center coordinates as an x, y by doing col, row
centers(i,:) =3D [colcenter rowcenter];
% Set window size =3D 2 * (Moo/256)^1/2
windowsize =3D 2 * (M00/256)^.5;
=20
% get side length ... window size is an area so =
sqrt(Area)=3Dsidelength
sidelength =3D sqrt(windowsize);
=20
% determine rmin, rmax, cmin, cmax =20
rmin =3D round(rowcenter-sidelength/2);
rmax =3D round(rowcenter+sidelength/2);
cmin =3D round(colcenter-sidelength/2);
cmax =3D round(colcenter+sidelength/2);
wsize(1) =3D abs(rmax - rmin);
wsize(2) =3D abs(cmax - cmin);
end
% end for loop
</PRE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -