資源簡介
基于OpenCV3( Python / C++ ) 的車道檢測代碼和測試視頻
代碼片段和文件信息
//?Author:?Francis?Liu
//?Email:?francislucien2017@126.com
//?This?code?is?about?lane?detection?by?using?OpenCV3.
#include
#include
#include
#include
#include
#include
#include
#include
using?std::cout;
typedef?std::vector?linesType;
const?double?PI?=?3.1415926535;
bool?show_steps?=?false;
//?m:?斜率?b:?截距?norm:?線長
struct?hough_pts?{
double?m?b?norm;
hough_pts(double?m?double?b?double?norm)?:
m(m)?b(b)?norm(norm)?{};
};
void?getROI(cv::Mat?img?std::vector?vertices?cv::Mat&?masked)?{
cv::Mat?mask?=?cv::Mat::zeros(img.size()?img.type());
if?(img.channels()?==?1)?{
cv::fillConvexPoly(mask?vertices?cv::Scalar(255));
}
else?if(img.channels()?==?3){
cv::fillConvexPoly(mask?vertices?cv::Scalar(255255255));
}
int?a?=?10;
cv::bitwise_and(img?img?masked?mask);
}
void?drawLines(cv::Mat&?img?linesType?lines?cv::Scalar?color)?{
for?(int?i?=?0;?i? cv::Point?pt1?=?cv::Point(lines[i][0]?lines[i][1]);
cv::Point?pt2?=?cv::Point(lines[i][2]?lines[i][3]);
cv::line(img?pt1?pt2?color?4?8);
}
}
void?averageLines(cv::Mat?linesType?lines?double?y_min?double?y_max?linesType&?output)?{
std::vector?left_lane?right_lane;
for?(int?i?=?0;?i? cv::Point2f?pt1?=?cv::Point2f(lines[i][0]?lines[i][1]);
cv::Point2f?pt2?=?cv::Point2f(lines[i][2]?lines[i][3]);
double?m?=?(pt2.y?-?pt1.y)?/?(pt2.x?-?pt1.x);
double?b?=?-m?*?pt1.x?+?pt1.y;
double?norm?=?sqrt((pt2.x?-?pt1.x)*(pt2.x?-?pt1.x)?+?(pt2.y?-?pt1.y)*(pt2.y?-?pt1.y));
if?(m?0)?{?//?left?lane
left_lane.push_back(hough_pts(m?b?norm));
}
if?(m?>?0)?{?//?right?lane
right_lane.push_back(hough_pts(m?b?norm));
}
}
double?b_avg_left?=?0.0?m_avg_left?=?0.0?xmin_left?xmax_left;
for?(int?i?=?0;?i? b_avg_left?+=?left_lane[i].b;
m_avg_left?+=?left_lane[i].m;
}
b_avg_left?/=?left_lane.size();
m_avg_left?/=?left_lane.size();
xmin_left?=?int((y_min?-?b_avg_left)?/?m_avg_left);
xmax_left?=?int((y_max?-?b_avg_left)?/?m_avg_left);
//?left?lane
output.push_back(cv::Vec4i(xmin_left?y_min?xmax_left?y_max));
double?b_avg_right?=?0.0?m_avg_right?=?0.0?xmin_right?xmax_right;
for?(int?i?=?0;?i? b_avg_right?+=?right_lane[i].b;
m_avg_right?+=?right_lane[i].m;
}
b_avg_right?/=?right_lane.size();
m_avg_right?/=?right_lane.size();
xmin_right?=?int((y_min?-?b_avg_right)?/?m_avg_right);
xmax_right?=?int((y_max?-?b_avg_right)?/?m_avg_right);
//?right?lane
output.push_back(cv::Vec4i(xmin_right?y_min?xmax_right?y_max));
//?left?lane:?output[0]
//?right?lane:?output[1]
}
void?bypassAngleFilter(linesType?lines?double?low_thres?double?high_thres?linesType&?output)?{
for?(int
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????6980??2018-10-27?09:52??lane?detection.cpp
?????文件????????6720??2018-10-26?22:26??lane?detection.py
?????目錄???????????0??2018-10-27?10:18??test_videos\
?????文件????15093678??2018-04-23?23:06??test_videos\test.mp4
- 上一篇:17個VC++與OPENGL寫的游戲程序代碼
- 下一篇:C/C++編譯仿真器
評論
共有 條評論