opencv 画延长线

时间:2023-03-09 04:28:44
opencv 画延长线

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

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

其他的代码部分可供参考

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

实验结果:

原图:

opencv 画延长线

车道检测结果:

opencv 画延长线

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

opencv 画延长线

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