📄 func_detect1.m
字号:
end
for y=Width-69:Width
if jieguo(x,y)>0
for m=10:1:70
for n=10:1:70
if jieguo(x+m,y-n)==0
bz=1+bz;
else
% bz=bz-1;
i4(x+m,y-n)=jieguo(x+m,y-n);
end
end
end
if (bz==61*61 && i4(x,y)==0)
i4(x,y)=0;
else
i4(x,y)=jieguo(x,y);
end
bz=0;
else
i4(x,y)=0;
bz=0;
end
end
end
clear jieguo x y m n bz;
%{
for i=1:Height
for j=1:Width
temp(i,j)=abs(i4(i,j)-i5(i,j));
end
end
%}
[io5,num5] = bwlabel(i5,8); %ig2
line5 = zeros(1,num5);
column5 = zeros(1,num5);
for i=1:num5
sumx=0;sumy=0;sumi=0;
for x = 1:Height
for y = 1:Width
if io5(x,y) == i
sumx = sumx + x*i5(x,y);
sumy = sumy + y*i5(x,y);
sumi = sumi + i5(x,y);
end
end
end
line5(i) = sumx/sumi;
column5(i) = sumy/sumi;
end
clear i5 i x y sumx sumy sumi ;
[io4,num4]=bwlabel(i4,8); %ig2
line4 = zeros(1,num4);
column4 = zeros(1,num4);
for i=1:num4
sumx=0;sumy=0;sumi=0;
for x = 1:Height
for y = 1:Width
if io4(x,y) == i
sumx = sumx + x*i4(x,y);
sumy = sumy + y*i4(x,y);
sumi = sumi + i4(x,y);
end
end
end
line4(i) = sumx/sumi;
column4(i) = sumy/sumi;
end
clear i4 i x y sumx sumy sumi ;
zuobiao5=[];
zuobiao4=[];
for i=1:num5
for j=1:num4
if abs(line5(i)-line4(j))<=3 && abs(column5(i)-column4(j))<=3
zuobiao5=[zuobiao5 i];
zuobiao4=[zuobiao4 j];
break;
end
end
end
if isempty(zuobiao5)==0
for i=1:size(zuobiao5,2)
for x=(round(line5(zuobiao5(i)))-5):(round(line5(zuobiao5(i)))+5)
for y=(round(column5(zuobiao5(i)))-5):(round(column5(zuobiao5(i)))+5)
if io5(x,y)==zuobiao5(i)
io5(x,y)=0;
end
end
end
end
end
if isempty(zuobiao4)==0
for i=1:size(zuobiao4,2)
for x=(round(line4(zuobiao4(i)))-5):(round(line4(zuobiao4(i)))+5)
for y=(round(column4(zuobiao4(i)))-5):(round(column4(zuobiao4(i)))+5)
if io4(x,y)==zuobiao4(i)
io4(x,y)=0;
end
end
end
end
end
for i=1:Height
for j=1:Width
if io5(i,j)~=0
io5(i,j)=1;
end
if io4(i,j)~=0
io4(i,j)=1;
end
end
end
temp=zeros(Height,Width);
for i=1:Height
for j=1:Width
temp(i,j)=abs(io5(i,j)-io4(i,j));
end
end
clear io4 io5 i j;
[io45,num45]=bwlabel(temp,8); %ig2
clear temp i4 i5 i j;
pixelnum45 = zeros(1,num45);
for i=1:num45
pixel=0;
for x = 1:Height
for y = 1:Width
if io45(x,y) == i
pixel = pixel +1;
end
end
end
pixelnum45(i) = pixel;
if pixelnum45(i)<10 %|| len12(i)<=4 || wid12(i)<=4
for m=1:Height
for n=1:Width
if io45(m,n)==i
io45(m,n)=0;
end
end
end
end
end
jieguo=zeros(Height,Width);
for i=1:Height
for j=1:Width
if io45(i,j)~=0
jieguo(i,j)=1;
end
end
end
clear io45 pixelnum45 num45 pixel i j x y;
% ---------- 统计处理后的星图中星个数 -------------------------------------
[io3,num3]=bwlabel(jieguo',8);
io3=io3';
mubiao=[]; %存放目标点在当初检测的所有星的信息中的位置;
cixu=[]; %存放当前帧目标点在处理后的星图中的位置;
geshu=0; %检测到的卫星个数;
mubiao_f=[];
cixu_q = [];
direct = zeros(1,num2);
sudu = zeros(1,num2);
if num3>0
line3 = zeros(1,num3);
column3 = zeros(1,num3);
count = zeros(1,num3);
%存放前一帧目标点在处理后星图中的位置;
for i = 1 : num3
sumx=0;sumy=0;sumi=0;
for x = 1:Height
for y = 1:Width
if io3(x,y) == i
sumx = sumx + x*i2(x,y);
sumy = sumy + y*i2(x,y);
sumi = sumi + i2(x,y);
end
end
end
line3(i) = sumx/sumi;
column3(i) = sumy/sumi;
for m=-10:10
for n=-10:10
mm=round(line3(i))+m;nn=round(column3(i))+n;
if mm>0 && mm<=Height && nn>0 && nn<=Width
if ig1(mm,nn)~=0
count(i)=count(i)+1;
end
end
end
end
if count(i) >= 10
cixu_q=[cixu_q i];
end
end
clear count io3 sumx sumy sumi pixel ymin ymax xmin xmax mm nn m n i jieguo;
% ---------- 检测多个目标 --------------------
for i = 1:num2
for j = 1 : num3
if abs(round(line2(i))-round(line3(j))) <= 1 && abs(round(column2(i))-round(column3(j))) <= 1
mubiao = [mubiao i];
cixu = [cixu j];
end
end
end
cixu_size=size(cixu,2);
cixuq_size=size(cixu_q,2);
size_final=min(cixu_size,cixuq_size);
if size_final > 0
deltax=zeros(1,size_final);
deltay=zeros(1,size_final);
jiaodu=zeros(1,size_final);
for i = 1 : size_final
deltax(i) = line3(cixu(i))-line3(cixu_q(i));
deltay(i) = column3(cixu(i))-column3(cixu_q(i));
jiaodu(i) = atand(abs(deltax(i))/abs(deltay(i)));
if deltax(i)>0 && deltay(i)>0
direct(mubiao(i)) = 360-jiaodu(i);
elseif deltax(i)>0 && deltay(i)<0
direct(mubiao(i)) = 180+jiaodu(i);
elseif deltax(i)<0 && deltay(i)>0
direct(mubiao(i)) = jiaodu(i);
else
direct(mubiao(i)) = 180-jiaodu(i);
end
sudu(mubiao(i)) = sqrt(deltax(i).^2+deltay(i).^2);
if sudu(mubiao(i))>0 && sudu(mubiao(i))<150
geshu=geshu+1;
mubiao_f=[mubiao_f mubiao(i)];
end
end
end
end
clear mubiao jiaodu deltax deltay i j;
SourceImage=uint16(i2);
clear i2;
DestImage=zeros(Height,Width);
if geshu>0
for i=1:geshu
xlabel=round(line2(mubiao_f(i)));
ylabel=round(column2(mubiao_f(i)));
% length=len2(mubiao_f(i));
% width=wid2(mubiao_f(i));
if xlabel>1 && ylabel>1 && xlabel<Height && ylabel<Width
for x=xlabel-1:xlabel+1
for y=ylabel-1:ylabel+1
DestImage(x,y)=1;
end
end
elseif xlabel==1 && ylabel>1 && ylabel<Width
for x=1:3
for y=ylabel-1:ylabel+1
DestImage(x,y)=1;
end
end
elseif ylabel==1 && xlabel>1 && xlabel<Height
for x=xlabel-1:xlabel+1
for y=1:3
DestImage(x,y)=1;
end
end
elseif xlabel==Height && ylabel>1 && ylabel<Width
for x=Height-2:Height
for y=ylabel-1:ylabel+1
DestImage(x,y)=1;
end
end
elseif ylabel==Width && xlabel>1 && xlabel<Height
for x=xlabel-1:xlabel+1
for y=Width-2:Width
DestImage(x,y)=1;
end
end
elseif xlabel==1 && ylabel==1
for x=1:3
for y=1:3
DestImage(x,y)=1;
end
end
elseif xlabel==1 && ylabel==Width
for x=1:3
for y=Width-2:Width
DestImage(x,y)=1;
end
end
elseif ylabel==1 && xlabel==Height
for x=Height-2:Height
for y=1:3
DestImage(x,y)=1;
end
end
elseif ylabel==Width && xlabel==Height
for x=Height-2:Height
for y=Width-2:Width
DestImage(x,y)=1;
end
end
end
end
line_out=zeros(1,geshu);
column_out=zeros(1,geshu);
direct_out=zeros(1,geshu);
sudu_out=zeros(1,geshu);
for i=1:geshu
line_out(i)=line2(mubiao_f(i));
column_out(i)=column2(mubiao_f(i));
direct_out(i)=direct(mubiao_f(i));
sudu_out(i)=sudu(mubiao_f(i));
end
else
line_out=[];
column_out=[];
direct_out=[];
sudu_out=[];
end
if reportoutput == 2
%--------- 写参数报告dat文件 ---------------------------------------
fid1=fopen(str{5},'w');
filename=strcat(str{6},'.fit');
fprintf(fid1,'FILENAME=%s \n',filename);
fseek(fid1,0,'cof');
fprintf(fid1,'TARGET=%s \n','Image');
fseek(fid1,0,'cof');
fprintf(fid1,'HEIGHT=%d \n',Height);
fseek(fid1,0,'cof');
fprintf(fid1,'WIDTH=%d \n',Width);
fseek(fid1,0,'cof');
fprintf(fid1,'STAROBJ_NUM=%d \n',num2);
fseek(fid1,0,'cof');
fprintf(fid1,'SATEOBJ_NUM=%d \n',geshu);
fseek(fid1,0,'cof');
for i = 1:num2
if sudu(i) == 0
fprintf(fid1,'Line=%10.4f Column=%10.4f Pixelnum=%6d Star_Len=%6d Star_Wid=%6d Direct=%6.2f V=%6.2f \n',line2(i),column2(i),pixelnum2(i),len2(i),wid2(i),direct(i),sudu(i)); %
fseek(fid1,0,'cof');
end
end
%-------- 将卫星的信息放在后面输出 -------------------------
if geshu>0
% if geshu==1
% fprintf(1,'There is %d target.\n',geshu);
% else
% fprintf(1,'There are %d targets.\n',geshu);
% end
for i=1:geshu
fprintf(fid1,'Line=%10.4f Column=%10.4f Pixelnum=%6d Star_Len=%6d Star_Wid=%6d Direct=%6.2f V=%6.2f \n',line2(mubiao_f(i)),column2(mubiao_f(i)),pixelnum2(mubiao_f(i)),len2(mubiao_f(i)),wid2(mubiao_f(i)),direct(mubiao_f(i)),sudu(mubiao_f(i))); %
fseek(fid1,0,'cof');
% fprintf(1,'The information of target %d are:\n',i);
% fprintf(1, ' target_line=%f ;\n target_column=%f ;\n target_size=%d ;\n target_len=%d ;\n target_wid=%d ;\n target_direct=%f ;\n target_speed=%f.\n',line2(mubiao_f(i)),column2(mubiao_f(i)),pixelnum2(mubiao_f(i)),len2(mubiao_f(i)),wid2(mubiao_f(i)),direct(mubiao_f(i)),sudu(mubiao_f(i)));
end
% else
% fprintf(1,'There is no target.\n');
end
fclose(fid1);
end
else
err=1;
SourceImage=zeros(Height,Width);
DestImage=zeros(Height,Width);
line_out=[];
column_out=[];
direct_out=[];
sudu_out=[];
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -