• 大小: 14.4MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-07-31
  • 语言: C/C++
  • 标签: CV  

资源简介

基于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 < lines.size(); ++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 < lines.size(); ++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 < left_lane.size(); ++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 < right_lane.size(); ++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

评论

共有 条评论