⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camshift.mht

📁 camshift算法matlab版
💻 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) &gt; 2) &amp;&amp; =
(abs(colcenter - colcenterold) &gt; 2)) || (count &lt; 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 + -