视频动态目标识别 MATLAB源程序(通信)
动态目标识别属于图像处理。最近很火的是人脸识别或者特征识别,该方向极具实际意义,如在海关检测和犯罪分子识别。下面的识别程序采用MATLAB编写,有大牛的详细注解,想必各位数字图像处理的研究生,急需此类程序。程序经过修改,已经没有问题!希望大家多交流学习!该例子很经典,后面还附有答疑,请多关注!附近里面有视频和程序!问题一:那是否可以在检测出的运动目标的基础上用肤色模型检测出人脸,调整窗口,以此来进行人脸的跟踪呢?
答:可以的,但肤色得打在脸上!
源程序:
[*] clear data[*]disp('input video');[*]avi = aviread('samplevideo.avi'); % 读取视频[*]video = {avi.cdata}; %得到视频中的图像数据[*]% 在figure中播放原始视频(一帧一帧图像连续显示)[*]for a = 1:length(video)[*] imagesc(video{a});[*] axis image off[*] drawnow;[*]end;[*]disp('output video');[*]tracking(video);% 调用目标检测跟踪程序[*][*]function d=tracking(video)[*]if ischar(video)[*] % 读取视频如果video,为视频的所在路径.[*] avi = aviread(video);[*] pixels = double(cat(4,avi(1:2:end).cdata))/255;[*] clear avi[*]else[*] % 直接读取视频中的帧,间隔取帧,得到一个四维的矩阵,里面放的是彩色图像[*] pixels = double(cat(4,video{1:2:end}))/255;[*] clear video[*]end[*]% 将每一帧的彩色图像转化为灰度图像[*]nFrames = size(pixels,4);% 帧的数目[*]for f = 1:nFrames[*] pixel(:,:,f) = (rgb2gray(pixels(:,:,:,f)));[*]end[*]rows=240;[*]cols=320;[*]nrames=f;[*]% 下面就是利用帧间做差发进行运动目标的跟踪[*]for l = 2:nrames[*] % 后一帧减去前一帧[*] d(:,:,l)=(abs(pixel(:,:,l)-pixel(:,:,l-1)));[*] k=d(:,:,l);[*] bw(:,:,l) = im2bw(k, .2);% 二值化[*] [*] bw1=bwlabel(bw(:,:,l)); % 连通标记[*] imshow(bw(:,:,l)) %显示图像[*] hold on[*] cou=1;[*] % 下面的目的就是得到二值图像中目标的大小,并矩形框出来,连续显示[*] for h=1:rows[*] for w=1:cols[*] if(bw(h,w,l)>0.5)[*] toplen = h;[*] if (cou == 1)[*] tpln=toplen;[*] end[*] cou=cou+1;[*] break[*] end[*] end[*] end[*] disp(toplen);[*] coun=1;[*] for w=1:cols[*] for h=1:rows[*] if(bw(h,w,l)>0.5)[*] leftsi = w;[*] if (coun == 1)[*] lftln=leftsi;[*] coun=coun+1;[*] end[*] break[*] end[*] end[*] end[*] disp(leftsi);[*] disp(lftln);[*] widh=leftsi-lftln;[*] heig=toplen-tpln;[*] widt=widh/2;[*] disp(widt);[*] heit=heig/2;[*] with=lftln+widt;[*] heth=tpln+heit;[*] wth(l)=with;[*] hth(l)=heth;[*] disp(heit);[*] disp(widh);[*] disp(heig);[*] rectangle('Position',,'EdgeColor','r');[*] disp(with);[*] disp(heth);[*] plot(with,heth, 'r*');[*] drawnow;[*] hold off[*]end;问题二:
for l = 2:nrames
% 后一帧减去前一帧
d(:,:,l)=(abs(pixel(:,:,l)-pixel(:,:,l-1)));
k=d(:,:,l);
bw(:,:,l) = im2bw(k, .2);% 二值化
bw1=bwlabel(bw(:,:,l)); % 连通标记
imshow(bw(:,:,l)) %显示图像
hold on
cou=1;
其中imshow(bw(:,:,l))显示的是黑白的图像,那请问怎么显示彩色的图像呢?
直接显示就是了……
在将rgb图像转为灰度图像的时候保留一份……
然后在显示的时候将保留的显示就是了……
[*] [*][*]function d=tracking(video)[*]if ischar(video)[*] % 读取视频如果video,为视频的所在路径.[*] avi = aviread(video);[*] pixels = double(cat(4,avi(1:2:end).cdata))/255;[*] clear avi[*]else[*] % 直接读取视频中的帧,间隔取帧,得到一个四维的矩阵,里面放的是彩色图像[*] pixels = double(cat(4,video{1:2:end}))/255;[*] pixelsrgb = double(cat(4,video{1:2:end}))/255;[*] clear video[*]end[*]% 将每一帧的彩色图像转化为灰度图像[*]nFrames = size(pixels,4);% 帧的数目[*]for f = 1:nFrames[*] pixel(:,:,f) = (rgb2gray(pixels(:,:,:,f)));[*]end[*]rows=240;[*]cols=320;[*]nrames=f;[*]% 下面就是利用帧间做差发进行运动目标的跟踪[*]for l = 2:nrames[*] % 后一帧减去前一帧[*] d(:,:,l)=(abs(pixel(:,:,l)-pixel(:,:,l-1)));[*] k=d(:,:,l);[*] bw(:,:,l) = im2bw(k, .2);% 二值化[*] [*] bw1=bwlabel(bw(:,:,l)); % 连通标记[*] %imshow(bw(:,:,l)) %显示图像[*] imshow(pixelsrgb(:,:,:,l)); % 显示彩色图像,标出运动……[*] hold on[*] cou=1;[*] % 下面的目的就是得到二值图像中目标的大小,并矩形框出来,连续显示[*] for h=1:rows[*] for w=1:cols[*] if(bw(h,w,l)>0.5)[*] toplen = h;[*] if (cou == 1)[*] tpln=toplen;[*] end[*] cou=cou+1;[*] break[*] end[*] end[*] end[*] disp(toplen);[*] coun=1;[*] for w=1:cols[*] for h=1:rows[*] if(bw(h,w,l)>0.5)[*] leftsi = w;[*] if (coun == 1)[*] lftln=leftsi;[*] coun=coun+1;[*] end[*] break[*] end[*] end[*] end[*] disp(leftsi);[*] disp(lftln);[*] widh=leftsi-lftln;[*] heig=toplen-tpln;[*] widt=widh/2;[*] disp(widt);[*] heit=heig/2;[*] with=lftln+widt;[*] heth=tpln+heit;[*] wth(l)=with;[*] hth(l)=heth;[*] disp(heit);[*] disp(widh);[*] disp(heig);[*] rectangle('Position',,'EdgeColor','r');[*] disp(with);[*] disp(heth);[*] plot(with,heth, 'r*');[*] drawnow;[*] hold off[*]end; 资料很详细!谢谢楼主! 资料很详细!谢谢楼主! 感谢楼主 分享是种美德:$ :D :( 学习,谢谢分享 谢谢楼主分享 NARK
页:
[1]