/**
* 标准霍夫变换检测图像中的直线
* HoughLines(
* Mat image, --输入图像
* Mat lines, --输出矢量。每一条线由具有两个元素的矢量(r,t)表示。r为离坐标原点的距离,t为弧度线条旋转角度
* double rho, --以像素为单位的距离精度。
* double theta, --以弧度为单位的角度精度。
* int threshold, --累加平面的阈值参数,即识别某部分为图中一直线时它在累加平面中必须达到的值。大于阈值的线段才可以被检测通过并返回到结果中。
* double srn = 0, --对于多尺度的霍夫变换,这是第三个参数rho的除数距离。粗略的累加器进步尺寸是rho,而精确的累加器进步尺寸为rho/srn。
* double stn = 0, --对于多尺度的霍夫变换,这是第四个参数theta的除数距离。粗略的累加器进步尺寸是theta,而精确的累加器进步尺寸为theta/srn。
* double min_theta = 0, --对于标准和多尺度霍夫变换,检查线的最小角度。必须介于 0 和 max_theta 之间。
* double max_theta = CV_PI --对于标准和多尺度霍夫变换,检查线的最大角度。必须介于 min_theta 和 CV_PI 之间。
* )
*/
@Test
public void testHoughLines() {
Mat src = GeneralUtils.converMat("C:\\图片\\test\\0003.jpg");
//Canny 二值化
Mat cannyMat = new Mat();
Imgproc.Canny(src, cannyMat, 80, 160, 3, false);
//霍夫直线检测,threshold越小检测出的直线越多
Mat lines = new Mat();
Imgproc.HoughLines(cannyMat, lines, 1.0, Math.PI / 180, 300);
//绘制直线
for (int i = 0; i < lines.rows(); i++) {
//离坐标原点距离
double rho = lines.get(i, 0)[0];
//弧度
double theta = lines.get(i, 0)[1];
double a = Math.cos(theta);
double b = Math.sin(theta);
double x0 = a * rho;
double y0 = b * rho;
Point p1 = new Point();
Point p2 = new Point();
p1.x = x0 + src.width() * (-b);
p1.y = y0 + src.height() * a;
p2.x = x0 - src.width() * (-b);
p2.y = y0 - src.height() * a;
Imgproc.line(src, p1, p2, new Scalar(0, 0, 255), 3 );
}
GeneralUtils.saveByteImg(src, "C:\\图片\\test\\houghLines.jpg");
}
/**
* 累计概率霍夫变换HoughLinesP
* 此函数在HoughLines的基础上末尾加了一个代表Probabilistic(概率)的P,
* 表明它可以采用累计概率霍夫变换(PPHT)来找出二值图像中的直线。输出是直线的两个点
* HoughLinesP(
* Mat src, -- 输入图像
* Mat lines, -- 输出的极坐标来表示直线,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。
* double rho, -- 生成极坐标时候的像素扫描步长,一般取值为 1
* double theta, --生成极坐标时候的角度步长,一般取值CV_PI/180,即表示一度
* int threshold, -- 阈值,只有获得足够交点的极坐标点才被看成是直线
* double minLineLength=0 --最小直线长度,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
* double maxLineGap=0 --最大间隔,有默认值0,允许将同一行点与点之间连接起来的最大的距离。
* )
*/
@Test
public void testHoughLinesP() {
Mat src = GeneralUtils.converMat("C:\\图片\\test\\0003.jpg");
//二值化
Mat cannyMat = new Mat();
Imgproc.Canny(src, cannyMat, 80, 160);
//计概率霍夫变换查找直线,直线最小长度设置为200
Mat lines = new Mat();
Imgproc.HoughLinesP(cannyMat, lines, 1, Math.PI / 180, 80, 200, 10);
//绘制直线
for (int i = 0; i < lines.rows(); i++) {
Point p1 = new Point(lines.get(i, 0)[0], lines.get(i, 0)[1]);
Point p2 = new Point(lines.get(i, 0)[2], lines.get(i, 0)[3]);
Imgproc.line(src, p1, p2, new Scalar(0, 0, 255), 1);
}
GeneralUtils.saveByteImg(src, "C:\\图片\\test\\houghLinesP.jpg");
}
《中医之钥》