中線提取算法
如果要讓小車先跑起來其實最重要就是中線提取算法 先運用最簡單的中線提取算法:就是從圖像中間向兩邊掃描,然後記錄下來
- 這個圖像我們采用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; //求出中線
}
限于作者水準有限,這是一段簡單提取中線的思想,新手同學可以參考下(後面會有更好的中線提取思想)^ -^/…