/*车道线检测,思路:
首先 ,对图像进行平滑处理,然后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;
}
首先 ,对图像进行平滑处理,然后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;
}