利用概率霍夫变换,进行车道线的简单检测
1、首先编写一个头文件(也可以在源文件中写一个类,一样的)
#ifndef LANE_H //头文件的写法格式 if not define
#define LANE_H //_LANE_H_ 为头文件Lane.h的大写,防止被重复引用(见CSDN)
//这里其实不用加ifndef,因为只有一个自定义的头文件
class Lane {
//头文件中写一个类,其实不用头文件也行,预处理会自动copy过去
private:
bool left_flag = true; //这里要设置为true,否则后头警告未初始化内存
bool right_flag = true;
double right_m, left_m; //定义在private中,定义在regression函数中会报错,未初始化内存
public:
cv::Mat noise(cv::Mat input_img);
cv::Mat edgedetector(cv::Mat noise_img);
cv::Mat ROI(cv::Mat edge_img);
std::vector<cv::Vec4i> Hough(cv::Mat ROI_img);
std::vector<std::vector<cv::Vec4i>> possibleline(std::vector<cv::Vec4i> lines, cv::Mat ROI_img);//筛选左右车道线的可能线
std::vector<cv::Point> regression(std::vector<std::vector<cv::Vec4i>> out, cv::Mat ROI_img);
void draw(cv::Mat input_img, std::vector<cv::Point> output);
};
#endif
2、opencv源文件
#include<opencv2/opencv.hpp>
#include<vector>
#include "Lane.h"
cv::Mat Lane::noise(cv::Mat input_img) {
cv::Mat output_img;
cv::GaussianBlur(input_img, output_img, cv::Size(3, 3), 0, 0);
/*参数详解:
InputArray src---- - 源图像
OutputArray dst---- - 目标图像
Size ksize----高斯内核大小,其中ksize.width和ksize.height可以不同,但是必须为正数
和奇数,也可为零,均有sigma计算而来。
double sigmaX----表示高斯函数在X方向的标准偏差
double sigmaY----表示高斯函数在Y方向的标准偏差
若sigma为零,就将它设为sigmaX, 如果两者均为零,就由ksize.width
和ksize.height计算出来。
int borderType---- - 用于推断图像外部像素的某种边界模式。
默认值 BORDER_DEFAULT */
std::cout << "noise function" << std::endl;
return output_img;
}
cv::Mat Lane::edgedetector(cv::Mat noise_img) {
//灰度化-二值化-边缘检测算子卷积
cv::Mat output_img; //定义输出图片
cv::Matx33f kernel(-1,0,1,-2,0,2,-1,0,1); //Matx<>为模板类,Matx33f为模板的实例
//Matx为固定矩阵类,不用于大型矩阵,可用于滤波中的kernel等
cv::cvtColor(noise_img, output_img,cv::COLOR_RGB2GRAY);
cv::threshold(output_img,output_img,120,256,cv::THRESH_BINARY);
//filter2D(src,dst,src.depth(),kernel);
//其中src与dst是Mat类型变量,src.depth表示图深度,有32,24,8等
cv::filter2D(output_img, output_img, output_img.depth(), kernel);
std::cout << "edgedetector function" << std::endl;
return output_img;
}
cv::Mat Lane::ROI(cv::Mat edge_img) {
cv::Mat ROI_img;
cv::Mat mask = cv::Mat::zeros(edge_img.size(), edge_img.type());
cv::Point pts[4] = {
cv::Point(210,720),cv::Point(550,450),cv::Point(717,450),cv::Point(1280,720)
};
cv::fillConvexPoly(mask,pts,4,cv::Scalar(255,0,0));
cv::bitwise_and(edge_img, mask, ROI_img);
std::cout << "ROI function" << std::endl;
//cv::imshow("roi", ROI_img);
return ROI_img;
}
std::vector<cv::Vec4i> Lane::


3万+

被折叠的 条评论
为什么被折叠?



