【轉】利用Catmull-Rom算法擬合曲線車道線

一、Catmull_Rom樣條曲線模型引入
Catmull_Rom樣條曲線擬合是曲線插值技術的一種,該插值技術能經過所給的所有控制點。BY THE WAY,很多插值技術可以參考http://www.cnblogs.com/WhyEngine/p/4020390.html
Catmull_Rom樣條曲線擬合方法需要至少四個控制點,公式如下:
在這裏插入圖片描述
其中,t屬於[0,1](也就是0-1中每個t值可能對應所求曲線中的某點,其取值越多,曲線越密)。實際上,四個控制點,曲線只會經過其中兩個控制點,如現在有控制點A,B,C,D,則最後的曲線擬合結果將如下:
在這裏插入圖片描述
得到的事BC之間的擬合曲線。那麼若要得到ABCD的擬合曲線應該怎麼辦呢。實際上,引入兩個新的控制點A’,D’即可,A’由AB計算而得,D’由CD計算而得,例如,A’計算如下:
A’.x = A.x + (A.x - B.x)
A’.y = A.y + (A.y - B.y)
B’點計算類似。於是,由A’ABC可以得到AB曲線,由ABCD可以得到BC曲線,由BCDD’可以得到CD曲線,經過三次計算,可以得到ABCD曲線。
在一張空白圖上,計算經過(50,50),(90,120),(70,200)三點的Catmull_Rom樣條曲線,程序如下:

IplImage* img = cvCreateImage(cvSize(300,300), 8, 1);  
for (int i = 0; i < img->height; ++i)  
{      
    for (int j = 0; j < img->width; ++j)  
      {         
       ((char *)(img->imageData + img->widthStep * (i)))[j] = 0;     
        }  
        }  
 CvPoint point0,point1,point2,point3,point4;//3個控制點來做  
 point1.x = 50;  
point1.y = 50; 
point2.x = 90;  
point2.y = 120;  
point3.x = 70; 
point3.y = 200;  
point0.x = point1.x+(point1.x-point2.x);  
point0.y = point1.y+(point1.y-point2.y);  
point4.x = point3.x+(point3.x-point2.x);  
point4.y = point3.y+(point3.y-point2.y);  
((char *)(img->imageData + img->widthStep * (point1.y)))[point1.x] = 255;  
((char *)(img->imageData + img->widthStep * (point2.y)))[point2.x] = 255;  
((char *)(img->imageData + img->widthStep * (point3.y)))[point3.x] = 255;  
for (int i = 1; i < 500 ; i++) 
{               
float t = (float) i * (1.0f / (float) 500);  
float t = (float) i * (1.0f / (float) 500);            
 float tt = t * t;             
 float ttt = tt * t;          
 CvPoint pi;  
 pi.x = 0.5 * (2*point1.x+(point2.x-point0.x)*t + (2*point0.x-5*point1.x+4*point2.x-point3.x)*tt + (3*point1.x-point0.x-3*point2.x+point3.x)*ttt);             
 pi.y = 0.5 * (2*point1.y+(point2.y-point0.y)*t + (2*point0.y-5*point1.y+4*point2.y-point3.y)*tt + (3*point1.y-point0.y-3*point2.y+point3.y)*ttt);         
((char *)(img->imageData + img->widthStep * (pi.y)))[pi.x] = 255;  
 }  
 for (int i = 1; i < 500 ; i++) {               
 float t = (float) i * (1.0f / (float) 500);             
 float tt = t * t;            
 float ttt = tt * t;          
  CvPoint pi;  
 pi.x = 0.5 * (2*point2.x+(point3.x-point1.x)*t + (2*point1.x-5*point2.x+4*point3.x-point4.x)*tt + (3*point2.x-point1.x-3*point3.x+point4.x)*ttt);             
 pi.y = 0.5 * (2*point2.y+(point3.y-point1.y)*t + (2*point1.y-5*point2.y+4*point3.y-point4.y)*tt + (3*point2.y-point1.y-3*point3.y+point4.y)*ttt);         
 ((char *)(img->imageData + img->widthStep * (pi.y)))[pi.x] = 255; 
  }  
  cvShowImage("scr", img); 
   cvWaitKey(0);  
   return 0;  

得到結果:
在這裏插入圖片描述
擬合效果較好。
二、基於Catmull_Rom樣條曲線的車道線檢測
2.1 基本思路
爲了更好地模擬車道線情況,給出下圖進行模擬實驗:
在這裏插入圖片描述
有了Catmull_Rom樣條曲線的基礎,那麼車道線檢測實際上就是找到合適的控制點!
給出基於Catmull_Rom樣條曲線的車道線檢測的基本方法(除去預處理過程):
參考:《基於Catmull-Rom 樣條曲線的彎曲車道線檢測研究,何 鵬,高 峯,魏厚敏》
(1)Hough變換直線檢測,將兩條主車道線檢測出來,直線記爲L1,L2;
(2)判斷是車道線是直線還是曲線;
(3)若車道線是曲線,找到三個控制點P1,P2,P3;
(4)通過三個控制點,擬合Catmull_Rom樣條曲線,得到結果
結束
2.2 具體實現
(1)Hough變換直線檢測:
首先,我們要將曲線車道線分爲兩個部分,一個是直線部分,一個是曲線部分,如下圖,直線部分在近區域端,看作是主車道線。
在這裏插入圖片描述
對主車道線進行直線檢測,爲了避免角度偏差過大的誤檢,我們限定檢測的角度範圍爲0°- 70°以及130°- 180°。(可以看到誤檢曲線角度往往在90°附近)
在這裏插入圖片描述
進行角度限制的Hough變換檢測直線,得到結果:
在這裏插入圖片描述
(2)判斷直線還是曲線:
若是直線,那麼Hough變換檢測的結果應該和實際直線吻合;而若是曲線,那麼,由(1)中可知,Hough變換實際上檢測的是直線部分,而曲線部分則會漏檢。
在這裏插入圖片描述

從上看出來: 直線檢測吻合 ,曲線檢測漏檢 。
按照此特性,若從上往下檢測(即從(x = 0,y = 0)開始 x++,y++到(x = w,y = h)),直線的Hough檢測結果將會基本吻合實際結果,即在檢測結果點的周圍,都將有實際點的存在;而曲線的Hough檢測結果,將會先出現檢測結果周圍沒有實際點,直到上圖P3點後,檢測結果點周圍纔會有實際點存在。
定義:1>.檢測結果點吻合:若檢測點周圍八領域內存在實際點,則代表檢測點結果吻合
於是該問題轉化爲:從圖頂向下搜索,能否找到P3點,使得P3點上部分一段區域(給定一個長度閾值alph1)檢測結果點都不吻合(引入容錯因子,防止噪聲theta),P3點下部分一段區域(同樣給定一個長度閾值alph2)檢測結果點吻合。若能找到P3點,則該車道線是曲線,否則,該車道線是直線!
(3)找到控制點P1,P2,P3:
P3控制點:實際上,步驟(2)中已經找到了其中一個控制點P3,P3點可以作爲直線部分和曲線部分的分界點,P3以上部分擬合曲線,P3一下部分保留Hough變換的直線檢測結果;

P1控制點:我們注意到,可以取遠端兩車道的消失點作爲控制點P1。
在這裏插入圖片描述
具體搜索方法:
1>找到Hough變換得到的兩直線的交點O。
2>從O點所在行向下搜索,找到P1。(從左往右搜索,第一個遇到的點即爲P1點)

P2控制點:得到了P1,P3兩點,則取P1,P3中間的一行搜索兩車道的P2點!

得到結果:
在這裏插入圖片描述
(4)經過三個控制點P1,2,3,使用Catmull_Rom樣條曲線擬合得到結果:
在這裏插入圖片描述
結論:
(1)從結果上來看,能得到曲線,擬合效果並不是很好,但是提升空間很大,比如增多控制點會讓曲線擬合更爲精準!
(2)控制點尋找的方法仍需要斟酌,因爲道路的情況及其複雜,所以需要針對可想的所有情況進行模擬!

三、檢測效果在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章