⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virloop.pas

📁 these are some texts and original program,they are very useful for transportation reserch.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
        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 + -