java opencv 基本操作14

标准霍夫变换HoughLines检测图像中的直线

    /**
     * 标准霍夫变换检测图像中的直线
     * 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检测直线

    /**
     * 累计概率霍夫变换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");
    }

《中医之钥》

你可能感兴趣的:(java,opencv,系列,opencv,计算机视觉)