曹宇飞 发表于 2015-1-9 15:48:03

视频动态目标识别 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;

曹宇飞 发表于 2015-1-14 13:22:49

资料很详细!谢谢楼主!

曹宇飞 发表于 2015-1-14 13:22:52

资料很详细!谢谢楼主!

谢卫宁 发表于 2015-1-26 17:07:56

感谢楼主

安丰贞 发表于 2015-2-26 10:34:16

分享是种美德:$

gobine 发表于 2015-10-11 14:34:27

:D

gobine 发表于 2015-10-11 14:34:32

:(

liuzengkun 发表于 2015-10-17 10:24:29

学习,谢谢分享

西瓜大de籽 发表于 2015-11-23 14:28:49

谢谢楼主分享

KIGI 发表于 2016-1-7 10:25:02

NARK
页: [1]
查看完整版本: 视频动态目标识别 MATLAB源程序(通信)