📄 virloop.pas
字号:
ll:=la[i];
rr:=ra[i];
{for j:=ll+1 to rr-1 do
begin
gray[0]:= diff1[i-1,j-1];
gray[1]:= diff1[i-1,j];
gray[2]:= diff1[i-1,j+1];
gray[3]:= diff1[i,j-1];
gray[4]:= diff1[i,j];
gray[5]:= diff1[i,j+1];
gray[6]:= diff1[i+1,j-1];
gray[7]:= diff1[i+1,j];
gray[8]:= diff1[i+1,j+1];
SelectMiddle(gray);
diff[i,j]:=gray[8];
end; }
for j:=ll to rr do
begin
gray1[0]:= diff1[i,j-1];
gray1[1]:= diff1[i,j];
gray1[2]:= diff1[i,j+1];
SelectMiddle(gray1);
diff[i,j]:=gray1[2];
end;
end;
for i:=lp_tp to lp_btm do
begin
ll:=la[i];
rr:=ra[i];
for j:=ll to rr do
begin
diff1[i,j]:=diff[i,j];
end;
end;
//腐蚀
for i:=lp_tp+1 to lp_btm-1 do
begin
ll:=la[i];
rr:=ra[i];
{for j:=ll+1 to rr-1 do
begin
gray[0]:= diff1[i-1,j-1];
gray[1]:= diff1[i-1,j];
gray[2]:= diff1[i-1,j+1];
gray[3]:= diff1[i,j-1];
gray[4]:= diff1[i,j];
gray[5]:= diff1[i,j+1];
gray[6]:= diff1[i+1,j-1];
gray[7]:= diff1[i+1,j];
gray[8]:= diff1[i+1,j+1];
SelectMiddle(gray);
diff[i,j]:=gray[0];
end; }
for j:=ll to rr do
begin
gray1[0]:= diff1[i,j-1];
gray1[1]:= diff1[i,j];
gray1[2]:= diff1[i,j+1];
SelectMiddle(gray1);
diff[i,j]:=gray1[0];
end;
end;
for i:=lp_tp to lp_btm do
begin
ll:=la[i];
rr:=ra[i];
for j:=ll to rr do
begin
diff1[i,j]:=diff[i,j];
end;
end;
for i:=lp_tp to lp_btm do
begin
ll:=la[i];
rr:=ra[i];
for j:=ll to rr do
begin
g_image3[(i*IMGWIDTH+j)*3]:=diff[i,j];
g_image3[(i*IMGWIDTH+j)*3+1]:=diff[i,j];
g_image3[(i*IMGWIDTH+j)*3+2]:=diff[i,j];
end;
end;
end;
end;// case end
sm:=0;
valuemax:=0;
num:=0;
for i:=lp_tp to lp_btm do
begin
ll:=la[i];
rr:=ra[i];
proj:=0;
for j:=ll to rr do
begin
sm:=sm+diff[i,j];
inc(num);
proj:=proj+diff[i,j];
end;
proj:=proj div (rr-ll+1);
if proj>valuemax then valuemax:=proj;
projct[i]:=proj;//每行的平均差分亮度
end;
sm:=sm/num;//计算虚拟线圈区域内的平均差分亮度
for i:=lp_tp to lp_btm do
if (projct[i]<valuemax*param14) and (i>m_tttt[idno]+1) and (m_carflg1_width[idno]>=1) then projct[i]:=0;
//param14=0.25 用于抑制车尾阴影的系数(0-1),值越大抑制越厉害
if sm>param16 then //param16=10 背景阈值 平均差分亮度大于该阈值则认为不是背景
begin
m_bg_cnt[idno]:=0;
m_bgsm[idno]:=0;
end
else //变换不大时,比较前后两帧的变化率
begin
if abs(sm-m_old_sm[idno])>param17 then //param17=0.9 背景偏差 前后两帧变化较大认为不是背景
begin
m_bg_cnt[idno]:=0;
m_bgsm[idno]:=0;
end
else //前后两帧变化不大,认为是背景
begin
inc(m_bg_cnt[idno]);//背景计数
m_bgsm[idno]:=m_bgsm[idno]+sm;
if m_bg_cnt[idno]>1000 then
begin
m_bgsm[idno]:=0;
m_bg_cnt[idno]:=0;
end;
if m_bg_cnt[idno]>15 then
begin
m_bg[idno]:=m_bg[idno]+0.1*(m_bgsm[idno]/m_bg_cnt[idno]-m_bg[idno]);//计算背景差分亮度值
//beep;
end;
end;
end;
m_old_sm[idno]:=sm;
lmt:=param19+m_bg[idno]; //param19=4 阈值的基准值 ,算出实际阈值
if lmt<param20 then lmt:=param20; //param20=6 背景下限
if lmt>param21 then lmt:=param21; //param21=10 背景上限
g_lmt:=round(lmt);
if sm>lmt then //平均差分亮度大于阈值
begin
thr:=lmt+param18*(sm-lmt); //param18=0.5阈值的浮动系数
for i:=lp_tp to lp_btm do
if (projct[i-1]>thr-1) and (projct[i]>thr) and (projct[i+1]>thr-1) then
smooth[i]:=1 else smooth[i]:=0;
for i:=lp_tp to lp_btm do
projct[i]:=smooth[i];
for i:=lp_tp to lp_btm do
begin
ll:=la[i];
rr:=ra[i];
if (projct[i]=1) then
begin
for j:=ll to rr do
begin
g_imageTwo[(i*IMGWIDTH+j)*3]:=255;
g_imageTwo[(i*IMGWIDTH+j)*3+1]:=255;
g_imageTwo[(i*IMGWIDTH+j)*3+2]:=255;
end;
end
else
begin
for j:=ll to rr do
begin
g_imageTwo[(i*IMGWIDTH+j)*3]:=0;
g_imageTwo[(i*IMGWIDTH+j)*3+1]:=0;
g_imageTwo[(i*IMGWIDTH+j)*3+2]:=0;
end;
end;
end;
m_clearflg[idno]:=0;
i:=m_tttt[idno]+round((lp_btm-cpt)*param1);//param1=24 向下搜索的深度,数越大越不易误抓(但可能抓得太晚)trunc:取整数
if i>lp_btm-1 then i:=lp_btm-1;
if i<=lp_tp+1 then i:=lp_tp+1;
repeat
dec(i);
until (i<=lp_tp+1) or (projct[i]=1);
tt:=i; //车尾的位置
if (tt<m_tttt[idno]) and (m_tttt[idno]<lp_btm-1) then
begin
mi:=0; //求中心
no:=0.001;
if tt-5>=lp_tp then ttbgn:=tt-5 else ttbgn:=lp_tp;
for i:=ttbgn to tt do
begin
ll:=la[i];
rr:=ra[i];
for j:=ll+1 to rr-1 do
if diff[i,j]>thr then
begin
mi:=mi+i;
no:=no+1;
end;
end;
mi:=round(mi/no);
g_mi:=mi;
g_mj:=0;
no:=0.001;
ll:=la[mi];
rr:=ra[mi];
for j:=ll+1 to rr-1 do
if diff[mi,j]>thr then
begin
g_mj:=g_mj+j;
no:=no+1;
end;
g_mj:=round(g_mj/no);
new_spi:=m_old_mi[idno]-mi;
m_old_mi[idno]:=mi;
if new_spi<0 then new_spi:=0;
if m_ave_spi[idno]=0 then m_ave_spi[idno]:=new_spi else m_ave_spi[idno]:=m_ave_spi[idno]+round(0.4*(new_spi-m_ave_spi[idno]));
end
else
begin
new_spi:=0;
m_ave_spi[idno]:=0;
end;
if (tt>lp_btm-round((lp_btm-cpt) * param2)) and (tt<lp_btm-1) then //param2=20 在多大范围内判断有车状态,值越大越不易漏抓
begin
if m_carflg_loop1[idno]=false then m_count_loop1[idno]:=0;
m_carflg_loop1[idno]:=true;
inc(m_count_loop1[idno]);
if tt>lp_btm-round((lp_btm-cpt) * param3) then //param3=6 控制抓拍第一幅全景的时机,值越小抓得越早
begin
result:=1;
//beep();
end;
end;
if m_carflg_loop1[idno]=true then
begin
old_carflg1_width:=m_carflg1_width[idno];
for i:=lp_tp+round((lp_btm-lp_tp)/param4) to lp_btm-1 do //param4=2 用于判断车辆面积的一个量(1-4),值越大越松、越小越严
begin
ll:=la[i];
rr:=ra[i];
www:=(rr-ll)*param5; //param5=0.4 用于判断车辆面积的一个量(0-1),值越大越严,越小越松
j:=ll+1;
do_loop1:
while (j<rr-www) and (diff[i,j]<=thr) do inc(j);
lll:=j;
inc(j);
while (j<rr-1) and (diff[i,j]>thr) do inc(j);
rrr:=j;
if rrr-lll>=www then
begin
inc(m_carflg1_width[idno]);
//beep;
g_rr1:=rrr;
g_ll1:=lll;
g_ii1:=i;
goto exit1;
end
else
if rr-j>www then goto do_loop1;
end;
exit1:
if old_carflg1_width=m_carflg1_width[idno] then //前后状态相同,表示没有根据宽度发现车
begin
inc(m_count_losewidth[idno]);
if m_count_losewidth[idno]>param6 then //param=6 允许特征丢失的次数,值越大越松
begin
m_carflg1_width[idno]:=0;//将标志清0
end;
end
else
begin
m_count_losewidth[idno]:=0;
end;
end;
carflg2_width:=0;
if (m_carflg_loop1[idno]=true) and (m_carflg1_width[idno]>1) and (tt>cpt-round((cpt-lp_tp) * param7)) and (tt<cpt) and (m_count_loop1[idno]>1) and (m_ave_spi[idno]>1) and (new_spi>1) then
//tt>cpt-param7 param7=30 用于判断车仍在虚拟线圈内的一个量,越大越不易漏车(但车可能出去的太多)
//tt>lp_tp-1
begin
m_tttt[idno]:=lp_btm;
for i:=lp_tp to lp_tp+round((lp_btm-lp_tp)/param8) do //param8=3 用于判断车辆面积的一个量(1-5)值越大越严
begin
ll:=la[i];
rr:=ra[i];
www:=(rr-ll)*param9;//param9=0.3 用于判断车辆面积的一个量(0-1),值越大越严
j:=ll;
do_loop2:
while (j<rr-www) and (diff[i,j]<=thr) do inc(j);
lll:=j;
inc(j);
while (j<rr-2) and ((diff[i,j]>thr) or (diff[i,j+1]>thr) or (diff[i,j+2]>thr)) do inc(j);
rrr:=j;
if rrr-lll>=www then
begin
carflg2_width:=1;
g_rr2:=rrr;
g_ll2:=lll;
g_ii2:=i;
beep;
goto exit2;
end
else
if rr-j>www then goto do_loop2;
end;
exit2:
nol:=0;
nor:=0;
for i:=lp_tp to lp_tp+round((lp_btm-lp_tp)/param10) do //param10=6.5 用于判断车辆行驶方向的一个量(5-15),值越小方向越准(但可靠性低)
begin
ll:=la[i];
rr:=ra[i];
for j:=ll to ((ll+rr) div 2)-trunc(param11) do //param11=10 用于判断车辆行驶方向的一个量(5-15),值越大方向越准(但可靠性低)
if (diff[i,j-1]>thr) and (diff[i,j]>thr) and (diff[i,j+1]>thr) then inc(nol);
for j:=((ll+rr) div 2)+trunc(param11) to rr do
if (diff[i,j-1]>thr) and (diff[i,j]>thr) and (diff[i,j+1]>thr) then inc(nor);
end;
drct_cdt:=false;
case drct of
0: drct_cdt:=true;
1: drct_cdt:=(nor>param12) and (nor>=nol*param13);//param12=20 用于判断车辆行驶方向的一个量(5-80),值越大可靠性越高
2: drct_cdt:=(nol>param12) and (nol>=nor*param13); //param13=0.4 用于判断车辆行驶方向的一个量(0-1),值越大越严
3: drct_cdt:=((nor>param12) and (nor>=nol*param13)) and ((nol>param12) and (nol>=nor*param13));
end;
if (carflg2_width=1) and (drct_cdt=true) then
//if (drct_cdt=true) then
begin
m_carflg_loop1[idno]:=false;
m_carflg1_width[idno]:=0;
result:=2;
m_count_keepstatus1[idno]:=0;
end;
end
else
begin
m_tttt[idno]:=tt;
end;
end
else
begin
inc(m_clearflg[idno]);
if m_clearflg[idno]>10 then m_clearflg[idno]:=10;
if m_clearflg[idno]>1 then
begin
m_tttt[idno]:=lp_btm;
m_carflg_loop1[idno]:=false;
m_carflg1_width[idno]:=0;
end;
for i:=lp_tp to lp_btm do
begin
ll:=la[i];
rr:=ra[i];
for j:=ll to rr do
begin
g_imageTwo[(i*IMGWIDTH+j)*3]:=0;
g_imageTwo[(i*IMGWIDTH+j)*3+1]:=0;
g_imageTwo[(i*IMGWIDTH+j)*3+2]:=0;
end;
end;
end;
if tt<cpt then m_tttt[idno]:=lp_btm;
for i:=lp_tp to lp_btm do
begin
ll:=la[i];
rr:=ra[i];
for j:=ll to rr do
m_img1[idno,i,j]:=m_img[idno,i,j];
end;
ret:
if keepcnt>0 then//挽救漏车的系数,即满足状态1但还不能满足状态2的次数
begin
if result=1 then m_count_keepstatus1[idno]:=1;
if m_count_keepstatus1[idno]>=1 then inc(m_count_keepstatus1[idno]);
if m_count_keepstatus1[idno]>keepcnt then
begin
m_carflg_loop1[idno]:=false;
m_carflg1_width[idno]:=0;
result:=2;
//beep;
m_count_keepstatus1[idno]:=0;
end;
end;
g_sm:=round(sm);
g_bg:=round(m_bg[idno]);
g_carflg_loop1:=m_carflg_loop1[idno];
g_carflg_width:=m_carflg1_width[idno];
g_carflg1:=carflg2_width;
g_count_loop1:=m_count_loop1[idno];
g_sp:=m_ave_spi[idno];
g_tt:=tt;
g_tttt:=m_tttt[idno];
g_clearflg:=m_clearflg[idno];
g_result:=result;
g_keepcount:=m_count_keepstatus1[idno];
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -