源码参考:

(16条消息) MATLAB_图像/视频目标检测_yamgyutou的博客-CSDN博客_matlab图像目标检测

在这位兄台的源码基础上改的,非常感谢。

 

 

 主函数

clc;
clear;
close all;
 
video_det=VideoReader('C:\Users\bme\Desktop/1.avi');
vidHeight = video_det.Height;
vidWidth = video_det.Width;
%这句可以查看帧数,但如果底下有readFrame函数不能有这句,会冲突
nFrames=video_det.NumFrames;
s=read(video_det,[300 803]);  
rate=video_det.FrameRate;%帧率
fileName='result_';
j=1;
for k=1:500
    im11=s(:,:,:,k);
    mov(j).cdata=rgb2gray(im11); 
%     mov(j+1).cdata=rgb2gray(s(:,:,:,k+3)); 
%     reg_im=abs(mov(j).cdata-mov(j+1).cdata)>8;
%     reg_im=erzhihua(mov(j).cdata,120)*255;
    reg_im=mov(j).cdata;
    j=j+1;
    SE = ones(5,5);
%     i3= bwmorph(reg_im,'dilate',9);%开运算
    h=8;
    i3=reg_im(1:h:end,1:h:end,:);
    i3=erzhihua(i3,120)*255;
        h1=fspecial('gaussian',5,1);
        i3=imfilter(i3,h1);
%     i3 = imerode(i3, SE);
    i3= qinshi(i3,2);
    i3= penzhang(i3,2);
    [c,r]=imfindcircles(i3, [4 50]);
%     [L, nm] = bwlabel(i3,8); %找出8连通域并标记
%     figure

    imshow(im11);
    
    str = ["绿","红","蓝","color4","color5","color6","color7","color8","color9","color10","color11","color12"];
    color=[150,245,250;200,220,230;86,130,220];
    z=3;%颜色种类
    cd=zeros(1,z);
g=zeros(size(c,1),3);
g=double(g);
h2=1;%间距
dg=0;%平均范围
for i=1:size(c,1)
    for j=-dg*h2:h2:dg*h2
        for k1=-dg*h2:h2:dg*h2
            for p=1:3
                g(i,p)=g(i,p)+double(im11(floor(c(i,2)+j)*h,floor(c(i,1)+k1)*h,p));
            end
         end
    end
     g(i,:)=g(i,:)/(dg*2+1)^2;
end
for i=1:size(g,1)
    for j=1:z
        cd(1,j)=abs(g(i,1)/color(j,1)-g(i,2)/color(j,2))+abs(g(i,2)/color(j,2)-g(i,3)/color(j,3))+abs(g(i,3)/color(j,3)-g(i,1)/color(j,1));
    end
    df=min(cd);
    for k=1:z
       if cd(1,k)==df
           str1(i)=str(k);
       end
    end 
end
    c=c.*h;
    r=r.*h;
    for i=1:size(c,1)
        hold on 
        plot(c(i,1),c(i,2),'wo','MarkerSize',r(i,1));
        text(c(i,1)-10, c(i,2), num2str(i), 'fontsize', 10);
text(c(i,1)-30, c(i,2), str1(i), 'fontsize', 10);
text(c(i,1)-30, c(i,2)+20, '半径', 'fontsize', 10);
text(c(i,1)+10, c(i,2)+20, num2str(r(i,1)), 'fontsize', 10);
    end
    hold off
%     for i = 1:nm
%         [r,c] = find(L == i);
%         left = min(c);
%         right = max(c);
%         top = min(r);
%         buttom = max(r);
%         width = right - left + 1;
%         height = buttom -top + 1;
%         rectangle('Position', [left, top, width, height],'EdgeColor',[1,0,0]);
%     end
    frame=getframe(gcf);
    result=frame2im(frame);
    strtem = strcat(fileName,int2str(k),'.','bmp');
%     imwrite(result,strtem);
% close all;
end
 
 
 
dn='E:\matlab代码\目标检测';
picname=fullfile( dn, strcat('*.','bmp'));
picname=dir(picname);
aviname='detect_vedio.avi';
aviobj = VideoWriter(aviname);
open(aviobj);
 
for i=1:length(picname)
    picdata=imread( fullfile(dn, (picname(i,1).name)));
    if ~isempty( aviobj.Height)
        if size(picdata,1) ~= aviobj.Height || size(picdata,2) ~= aviobj.Width
            close(aviobj);
            delete( aviname )
            error('所有图片的尺寸要相同!!');
        end
    end
    writeVideo(aviobj,picdata);
end
close(aviobj);

侵蚀膨胀还有二值化自己写了一下,后来才知道有库函数

function img=erzhihua(img,l)
m=size(img,1);
n=size(img,2);
for i=1:m
    for j=1:n
        if img(i,j)<l
            img(i,j)=0;
        else
            img(i,j)=1;
        end
    end
end
function I=qinshi(I,l)
I=padarray(I, [l l], 255);
% figure
% imshow(I);title('90');
[m,n]=size(I);
cg=zeros(2*l+1:2*l+1);
for i=l+1:m-l
    for j=1+l:n-l
        cg=I(i-l:i+l,j-l:j+l);
        I3(i-l,j-l)=min(min(cg))-20;
    end
end
I=I3;
% figure
% imshow(I);
function I=penzhang(I,l)
I=padarray(I, [l l], 0);
% figure
% imshow(I);title('90');
[m,n]=size(I);
cg=zeros(2*l+1:2*l+1);
for i=l+1:m-l
    for j=1+l:n-l
        cg=I(i-l:i+l,j-l:j+l);
        I3(i-l,j-l)=max(max(cg));
    end
end
I=I3;
% figure
% imshow(I);

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐