通过霍夫变换寻找图像中的直线
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);
}
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);
}