天天看點

軟體設計(中線提取)

中線提取算法

如果要讓小車先跑起來其實最重要就是中線提取算法 先運用最簡單的中線提取算法:就是從圖像中間向兩邊掃描,然後記錄下來

軟體設計(中線提取)
  • 這個圖像我們采用2維數組表示(最上面的為第0行)假設一行有80個,是以第一行中間的坐标就是(0,40)我們從中間坐标開始進行左周遊,當掃描到第一個跳變點的時候(就是指左邊的一個點是黑點,右邊的一個點是白點時)我們認為這時就掃描到了左邊的賽道邊界,此時記錄左邊界坐标(假設是 (0,20))。放入左邊界數組中。同理進行右周遊,得到右邊界坐标(假設是(0,60)),也存入右邊界數組中。這時第一行的左右邊界都已經找到,就可以計算中線坐标了。同理可以求出剩下59行的中線坐标。但是這隻是理想情況,有時因為攝像頭的畸變原因,會導緻攝像頭失真,也就是說有時可能隻有左邊界,有時隻有右邊界,有時左右邊界都找不到,這時求出的中線就是無意義的,是以簡單起見(後面會有更好的方法),當我們找不到這一行的左右邊界時,我們就利用上一行的左右邊界作為代替,這樣是為了保證求出的中線有更好的連續性和跟随性。代碼如下:
for(i=59;i>9;) 

 {

    i-=2;				//隔行處理 減小單片機負荷

    for(j=40;j>0;j--)  // 從中間向左邊搜尋,尋找黑點

    {

      if(img[j]==0xff && img[j-1]==0x00) //掃描到跳變點

      {

        Left_Line[i]=j;    //記錄左邊界資料

        Left_Line_Old[i]=Left_Line[i]; 	//保留資料

        break;

      }

      else

      {

        Left_Line[i]=0;  // 未找到左邊邊界

      }

    }

    for(j=41;j<80;j++)          // 從中間向右邊搜尋,尋找右邊邊界

    {

      if(img[j]==0xff && img[j+1]==0x00)

      {

        Right_Line[i]=j;         

        Right_Line_Old[i]=Right_Line[i];  

        break; 

      }

      else

      {

        Right_Line[i] = 0;   //未找到右邊邊界

      }

    }

    if(Left_Line[i]== 0 || Right_Line[i] == 0)    

    {                                      

      Left_Line[i]  = Left_Line_Old[i];

      Right_Line[i] = Right_Line_Old[i];

    }

      Middleline_Line[i]=(Left_Line[i] + Right_Line[i] )/2;	//求出中線
}

           

限于作者水準有限,這是一段簡單提取中線的思想,新手同學可以參考下(後面會有更好的中線提取思想)^ -^/…

繼續閱讀