opencv vs 下 车道线的检测

/*车道线检测,思路:
首先 ,对图像进行平滑处理,然后Canny边缘检测,使用Hough画直线
郭洪成
2015.3.31


*/
#include<cv.h>
#include<highgui.h>
#include<math.h>
#include<vector>
#include<string.h>
#include <atlstr.h>
#include <io.h>


//自定义LINE结构体 
//由pt0,pt1两个点连接成一段线段 
struct LINE  
{  
CvPoint pt0;  
CvPoint pt1;  
LINE( CvPoint pta, CvPoint ptb )  
{  
pt0 = pta;  
pt1 = ptb;  
}  //带参构造函数LINE( ),用于构造一个LINE
LINE()  
{  
pt0.x = pt0.y = 0;  
pt1.x = pt1.y = 0;  
}  //无参构造函数,原点(0,0)
};  








// 得到两条平行线之间的距离  
double GetDisOfParallelLines( LINE line0, LINE line1 )  
{  
CvPoint midPoint = cvPoint( (line0.pt0.x + line0.pt1.x)/2, (line0.pt0.y + line0.pt1.y)/2 ); // 中点  
double x_dis = line1.pt0.x - line1.pt1.x;  
if ( x_dis == 0.0 ) return fabs((double)(midPoint.x - line0.pt1.x)); // 如果line1 垂直x轴  


double a = (line1.pt0.y - line1.pt1.y) / x_dis;  
double b = line1.pt0.y - (line1.pt0.x * a);  
return fabs(a * midPoint.x - midPoint.y + b) / sqrt(a * a + 1);  
}  




//得到一条直线的tan率,也就是对边/邻边
double GetTanOfLine( LINE line )  
{  
double x_dis = line.pt0.x - line.pt1.x;  
if ( x_dis == 0.0 ) return 10e9;  
return (line.pt0.y - line.pt1.y) / x_dis;  
}  




//判断两条直线是否是平行线,通过球每条直线的tan率来比较
bool IsParallelLines( LINE line0, LINE line1 )  
{  
#define LIMIT (1.1547 / 3) //近似平行线的斜率之差的范围  


double angleTan0 = GetTanOfLine( line0 );  
double angleTan1 = GetTanOfLine( line1 );  
if ( fabs(angleTan0 - angleTan1) < (double)LIMIT )  
{  
return 1;  
}  
return 0;  
}  


//遍历文件夹文件的辅助函数
bool GetPicDirSetInFolder(CString strFindPath, std::vector<CString> &vecPathSet)  
{  
WIN32_FIND_DATA wfd;  
HANDLE hf = FindFirstFileA(strFindPath, &wfd);  


if (INVALID_HANDLE_VALUE != hf)  
{   
vecPathSet.push_back(wfd.cFileName);  
while (FindNextFileA(hf, &wfd))  
{  
vecPathSet.push_back(wfd.cFileName);  
}  
FindClose(hf);  
}  
return true;  



//计算一根线段的长度
double fGetLen(LINE fLine )
{
return  sqrt(  (fLine.pt0.x - fLine.pt1.x) * (fLine.pt0.x - fLine.pt1.x) +
( fLine.pt0.y - fLine.pt1.y) *( fLine.pt0.y - fLine.pt1.y)  )  ;
}


//获取所输入直线最长的一根
LINE fGetMaxLine(LINE fLine1 , LINE fLine2)
{
double fDisOfL1 = sqrt(  (fLine1.pt0.x - fLine1.pt1.x) * (fLine1.pt0.x - fLine1.pt1.x) +
( fLine1.pt0.y - fLine1.pt1.y) *( fLine1.pt0.y - fLine1.pt1.y) );


double fDisOfL2 = sqrt(  (fLine2.pt0.x - fLine2.pt1.x) * (fLine2.pt0.x - fLine2.pt1.x) +
( fLine2.pt0.y - fLine2.pt1.y) *( fLine2.pt0.y - fLine2.pt1.y) );


if ( fDisOfL1  >  fDisOfL2  )
return fLine1;
else return fLine2;
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值