c++ 车道线检测

利用概率霍夫变换,进行车道线的简单检测
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::
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值