动态目标识别属于图像处理。最近很火的是人脸识别或者特征识别,该方向极具实际意义,如在海关检测和犯罪分子识别。下面的识别程序采用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',[lftln tpln widh heig],'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',[lftln tpln widh heig],'EdgeColor','r');
- disp(with);
- disp(heth);
- plot(with,heth, 'r*');
- drawnow;
- hold off
- end;
|
|
共 9 个关于本帖的回复 最后回复于 2016-1-7 10:25