用matlab和霍夫变换检测视频中的圆
用matlab和霍夫变换检测视频中的圆
·
源码参考:
(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);

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