代码改变世界

opencv 画延长线

2016-04-10 13:53  GarfieldEr007  阅读(1542)  评论(0编辑  收藏  举报

hough变换可以让我们检测到直线,这在前面已有详解,对于车道检测,我们需要其到图像边界的延长线一遍之后数据帧分析。

以下代码帮助我们在opencv中画延长线,本来想用虚线表示延长线的,无奈参数调不好了……只好把bug的虚线贴上去注释掉了,希望牛人能给点帮助帮我调下吧

其他的代码部分可供参考

 

[cpp] view plain copy
 
  1. void CCVMFCView::OnDottedLine(CvPoint p1,CvPoint p2,IplImage *workimg)  
  2. {  
  3.     double k=(p2.y-p1.y)/(p2.x-p1.x+0.000001);  
  4.     double DOT_STEP;  
  5.     CvPoint pa=p1,pb=p1;  
  6.       
  7.     cvLine(workimg,p1,p2,CV_RGB(255,255,0),3, CV_AA, 0 );  
  8.   
  9.     //dotted line , has bug        ╮(╯_╰)╭  
  10.   
  11.     //while(pb.x>0&&pb.x<workimg->width&&pb.y<p2.y)  
  12.     //{  
  13.     //  pb.x+=DOT_STEP;  
  14.     //  pb.y+=DOT_STEP*k;  
  15.     //  cvLine(workimg,pa,pb,CV_RGB(255,255,0),3, CV_AA, 0 );  
  16.     
  17.     //  pb.x+=DOT_STEP;  
  18.     //  pb.y+=DOT_STEP*k;  
  19.     //  pa=pb;  
  20.     //  pb.x+=DOT_STEP;  
  21.     //  pb.y+=DOT_STEP*k;  
  22.     //}  
  23. }  
  24.   
  25. // find two endpoint of the faint line  
  26. void CCVMFCView::OnDrawDotline(CvPoint s, CvPoint e,IplImage *workimg)  
  27. {  
  28.     CvPoint pa,pb;  
  29.     if(s.y>e.y)//swap  
  30.     {  
  31.         pa=s;  
  32.         s=e;  
  33.         e=pa;  
  34.     }  
  35.     double k=(e.y-s.y)/(e.x-s.x+0.000001);  
  36.     double h=workimg->height,w=workimg->width;  
  37.   
  38.     pb=s;  
  39.     pa.y=0,pa.x=s.x-s.y/k;          //start point on the low line  
  40.     if(pa.x<0)       //start point on the left line  
  41.         pa.x=0,     pa.y=k*s.x;  
  42.     else if(pa.x>=w)  
  43.         pa.x=w, pa.y=s.y+k*(w-s.x);  
  44.   
  45.     OnDottedLine(pb,pa,workimg);  
  46.   
  47.     pa=pb=e;  
  48.     pb.y=h; pb.x+=(h-e.y)/k;  
  49.     if(pb.x>w)  
  50.         pb.y=e.y+k*(w-e.x), pb.x=w;  
  51.     else if(pb.x<0)  
  52.         pb.y=e.y-k*e.x,     pb.x=0;  
  53.   
  54.     OnDottedLine(pa,pb,workimg);  
  55. }  


实验结果:

 

原图:

车道检测结果:

 

hough变换检测+延长线(绿:检测结果。黄:延长线)

 

from: http://blog.csdn.net/abcjennifer/article/details/7440887