Java Opencv hough直线检测

参考链接:
https://blog.csdn.net/m1109048058/article/details/77334309
https://www.cnblogs.com/skyfsm/p/6881686.html
霍夫线变换

霍夫线变换是一种在图像中寻找直线的方法。OpenCV中支持三种霍夫线变换,分别是标准霍夫线变换、多尺度霍夫线变换、累计概率霍夫线变换。

在OpenCV中可以调用函数HoughLines来调用标准霍夫线变换和多尺度霍夫线变换。HoughLinesP函数用于调用累积概率霍夫线变换。

我们都知道,二维坐标轴上表示一条直线的方程式y = a*x + b,我们想求出一条直线就得想方设法求出其中的a和b的值。如果用极坐标来表示就是

在这里插入图片描述

theta就是直线与水平线所成的角度,而rho就是圆的半径(也可以理解为原点到直线的距离),同样地,这两个参数也是表征一条直线的重要参数,确定他们俩了,也就确定一条直线了。正如下图所示。

在这里插入图片描述

在OpenCV里,我们只需调用HoughLines就是可以得到表征一条直线的这两个参数值!

标准hough变换:
Imgproc.HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn, double min_theta, double max_theta)
参数说明:
image:源图像
lines:hough变换后储存检测到的线条的输出矢量
rho:以像素为单位的距离精度
theta:以弧度为单位的角度精度
threshold:识别某部分为一条直线时必须达到的值
srn:rho参数的除数距离,有默认值0
stn:theta参数的除数距离,默认值0
min_theta:检测到的直线的最小角度
max_theta:检测到的直线的最大角度

HoughLines代码

public static void main(String[] args) {
        System.load("F:\\opencv\\x64\\opencv_java401.dll");

        Mat src = Imgcodecs.imread("C:\\Users\\beawan\\Desktop\\test\\test.jpg");
        Mat canny = new Mat();
        Imgproc.Canny(src, canny, 50, 200, 3);
        Mat storage = new Mat();
        //这里注意第五个参数,表示阈值,阈值越大,表明检测的越精准,速度越快,得到的直线越少(得到的直线都是很有把握的直线)
        //这里得到的lines是包含rho和theta的,而不包括直线上的点,所以下面需要根据得到的rho和theta来建立一条直线
        Imgproc.HoughLines(canny, storage, 1, Math.PI / 180, 150, 0, 0, 0, 10);
        for (int x = 0; x < storage.rows(); x++) {
            double[] vec = storage.get(x, 0);

            double rho = vec[0]; //就是圆的半径r
            double theta = vec[1]; //就是直线的角度

            Point pt1 = new Point();
            Point pt2 = new Point();

            double a = Math.cos(theta);
            double b = Math.sin(theta);

            double x0 = a * rho;
            double y0 = b * rho;

            int lineLength = 1000;

            pt1.x = Math.round(x0 + lineLength * (-b));
            pt1.y = Math.round(y0 + lineLength * (a));
            pt2.x = Math.round(x0 - lineLength * (-b));
            pt2.y = Math.round(y0 - lineLength * (a));

            if (theta >= 0) {
                Imgproc.line(src, pt1, pt2, new Scalar(255, 0, 0), 1, Imgproc.LINE_4, 0);
            }
        }
        Imgcodecs.imwrite("C:\\Users\\beawan\\Desktop\\test\\houghLines.jpg", src);
    }

图片
在这里插入图片描述
直线
在这里插入图片描述

累计概率hough变换:
Imgproc.HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap)
参数说明:
image:源图像
lines:hough变换后储存检测到的线条的输出矢量
rho:以像素为单位的距离精度
theta:以弧度为单位的角度精度
threshold:识别某部分为一条直线时必须达到的值
minLineLength:最低线段的长度,默认为0
maxLineGap:允许将同一行点与点之间连接起来的最大的距离,默认为0

public static void main(String[] args) {
        System.load("F:\\opencv\\x64\\opencv_java401.dll");

        Mat src = Imgcodecs.imread("C:\\Users\\beawan\\Desktop\\test\\test.jpg");
        Mat canny = new Mat();
        Imgproc.Canny(src, canny, 50, 200, 3);
        Mat storage = new Mat();
        Imgproc.HoughLinesP(canny, storage, 1, Math.PI / 180, 200, 0, 0);

        for (int x = 0; x < storage.rows(); x++) {
            double[] vec = storage.get(x, 0);
            double x1 = vec[0], y1 = vec[1], x2 = vec[2], y2 = vec[3];
            Point start = new Point(x1, y1);
            Point end = new Point(x2, y2);
            Imgproc.line(src, start, end, new Scalar(255, 0, 0), 5, Imgproc.LINE_4, 0);
        }

        Imgcodecs.imwrite("C:\\Users\\beawan\\Desktop\\test\\houghLinesP.jpg", src);
    }

直线
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中使用OpenCV进行直线检测可以使用Hough变换算法。下面是一个简单的示例代码,演示了如何使用HoughLinesP方法进行直线检测: ```java import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import java.util.List; public class HoughLineDetector { static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } public static void main(String[] args) { // 加载图像 Mat image = Imgcodecs.imread("test.jpg"); // 转换为灰度图像 Mat grayImage = new Mat(); Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY); // 检测直线 Mat lines = new Mat(); Imgproc.HoughLinesP(grayImage, lines, 1, Math.PI / 180, 50, 50, 10); // 绘制直线 for (int i = 0; i < lines.cols(); i++) { double[] val = lines.get(0, i); Point pt1 = new Point(val[0], val[1]); Point pt2 = new Point(val[2], val[3]); Imgproc.line(image, pt1, pt2, new Scalar(0, 0, 255), 3); } // 显示结果 Imgcodecs.imwrite("result.jpg", image); } } ``` 在这个示例代码中,我们首先加载图像,然后将其转换为灰度图像。接着,我们使用HoughLinesP方法来检测直线,该方法需要传入以下参数: - 输入图像(灰度图像) - 存储检测到的直线的Mat对象 - 两条直线之间的最小距离(以像素为单位) - 角度精度(以弧度为单位) - 线段上的最小像素数 - 线段最小长度 - 线段间最大间隔 最后,我们遍历检测到的直线,并使用Imgproc.line方法在原始图像上绘制直线。最终,我们将结果保存到磁盘上。 需要注意的是,这只是一个简单的示例代码,实际应用中可能需要调整参数以获得更好的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值