基于图像的车道偏离预警,基于openCV

前言:

        算法自己写,只用到openCV的IO函数等。之前的毕业设计,现在很闲,拿出来改改,发出来。

目标:

        检测出视频中的车道线

思路:

       1.摄像机拍摄的视频有透视投影变换,所以先进行反透视变换。因为车道线是平行的,两条车道线之间的距离和平行信息是很重要的鲁棒性信息

       2.道路是曲线的,要将图像分成多个片段,每个片段内近似认为是直线,最后将直线拟合成曲线

       3.使用Hough变换进行直线检测,同时建立感兴趣区域(上帧图片中车道线附近的区域)以提高算法的性能。

       4.使用kalman滤波进行车道线预测

       5.由于没有硬件,全部使用电脑模拟,开了3个线程用来进行图像预处理,开了1个线程用来检测车道线,大约1s能处理16帧。

       6.图像需要预处理,这部分不写了

效果:

      原图:

基于图像的车道偏离预警,基于openCV_第1张图片

反透视:

基于图像的车道偏离预警,基于openCV_第2张图片

先腐蚀,后膨胀:

基于图像的车道偏离预警,基于openCV_第3张图片

边缘检测:

基于图像的车道偏离预警,基于openCV_第4张图片

感兴趣区域,hough变换,kalman滤波:

基于图像的车道偏离预警,基于openCV_第5张图片



int lineHough(cv::Mat &I,HoughLine &lines,InterestPoint &int_point,double theta_min,double theta_max,double theta_step,double p_step){
	std::vector rho,theta;				//used to generate the grids
	std::vector votes_of_chosen_line;		//save the votes of each line
	cv::Mat vote;								//used to save the votes
	unsigned int i=0,j=0;						//used to index the hough lines 
	int row=0,col=0;							//used to index the interest area
	int half_size_of_rho=0;						//value of half size of rho array
	int rho_index=0;							//used to index rho array
	int max_vote=0;								//used to save the maximum value of vote
	double rho_max=0,rho_min=0,rho_tmp=0,theta_tmp=0.0;		//used to generate rho and theta grid
	double cos_tmp=0.0,sin_tmp=0.0;				//sin and cos value
	Vec2d point_tmp;							// tmp line
	bool l_line_repeat=false;					//if the line is repeat 
	int thresh=0;								//used to filter the hough peaks

	//check if the input image is valid, only 8 depth and 1 channels image are ok
	assert(I.depth()==CV_8U);assert(I.channels()==1);

	//generate the grids of theta and rho
	theta_tmp=theta_min;
	do{
		theta.push_back(theta_tmp);
		theta_tmp+=theta_step;
	}while(theta_tmp=0)&&(rho_index(rho_index,i)+=1;
				//get the maximum vote
				if(vote.at(rho_index,i)>max_vote){
					max_vote=vote.at(rho_index,i);
				}
			}
		}
	}

	//filter the peaks by thresh
	thresh=(int)(VOTE_RATIO*max_vote);
	thresh=thresh>VOTE_MIN?thresh:VOTE_MIN;
	for (row=0;row(row,col)>thresh){
				//cout<<"votes at (rho="<(row,col)<<"	row="<


你可能感兴趣的:(图像识别)