当前位置: 首页 > 工具软件 > cv_resume > 使用案例 >

cv::HoughLinesP() 与 cv::HoughLines()

於和志
2023-12-01

函数作用

通过霍夫变换寻找图像中的直线

函数原型

cv::HoughLines()

void cv::HoughLines	(InputArray 	image,  // 必须为单通道8位二进制图像
					 OutputArray 	lines, // 类型:vector<Vec2f> 表示形式为(ro,theta)
					 double		 	rho,   // 生成极坐标时像素的扫描步长,一般为1
					 double		 	theta,  //角度分辨率
					  int 	 		threshold, // 阈值,只有获得交点数大于该值才视为直线
					double		 	srn = 0, // 是否应用多尺度的霍夫变换,默认不使用
					double		 	stn = 0,// 是否应用多尺度的霍夫变换,默认不使用
					double 			min_theta = 0, // 角度的扫描范围,默认为[0,180]
					double		 	max_theta = CV_PI 
					)		
Python:
cv.HoughLines(	image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]	) ->	lines

该函数的输出极坐标表示直线,一般需要经过如下变换:

    vector<Vec2f> lines;     
	HoughLines(src_gray, lines, 1, CV_PI / 180, 150, 0, 0);
	for (size_t i = 0; i < lines.size(); i++) { 
		float rho = lines[i][0]; // 极坐标中的r长度
		float theta = lines[i][1]; // 极坐标中的角度
		Point pt1, pt2;         
		double a = cos(theta), b = sin(theta);         
		double x0 = a*rho, y0 = b*rho;      
		// 转换为平面坐标的四个点
		pt1.x = cvRound(x0 + 1000 * (-b));        
		pt1.y = cvRound(y0 + 1000 * (a));         
		pt2.x = cvRound(x0 - 1000 * (-b));         
		pt2.y = cvRound(y0 - 1000 * (a));         
		line(dst, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA); 
	}

cv::HoughLinesP()


void cv::HoughLinesP(InputArray 		image,
					 OutputArray 		lines,// 类型:vector<Vec4f> 表示形式为(x1,y1,x2,y2)
					 double 			rho,
					 double 			theta,
					 int 		     	threshold,
					 double 			minLineLength = 0,
					 double 			maxLineGap = 0 
					)	

实例:

    vector<Vec4f> plines;
	HoughLinesP(src_gray, plines, 1, CV_PI / 180.0, 10, 0, 10);
	Scalar color = Scalar(0, 0, 255);
	for (size_t i = 0; i < plines.size(); i++) {
		Vec4f hline = plines[i];
		line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA);
	}
 类似资料: