OpenCV HoughLine 仅检测图像中的一行

Posted

技术标签:

【中文标题】OpenCV HoughLine 仅检测图像中的一行【英文标题】:OpenCV HoughLine only detect one line in image 【发布时间】:2017-11-20 09:51:04 【问题描述】:

我正在关注 openCV 的 docs/tutorial 来检测图像中的线条。但是,我只得到了图像中四个相似线条中的一个。 这是result

这是我的代码:

Mat im = Imgcodecs.imread("C:/Users/valer/eclipse-workspace/thesis-application/StartHere/resource/4 lines.JPG");
    
    Mat gray = new Mat(im.rows(), im.cols(), CvType.CV_8SC1);
    
    Imgproc.cvtColor(im, gray, Imgproc.COLOR_RGB2GRAY);

    Imgproc.Canny(gray, gray, 50, 150);
    
    Mat lines = new Mat();

    Imgproc.HoughLines(gray, lines, 1, Math.PI/180, 200);

    for (int i = 0; i < lines.cols(); i++)
        double data[] = lines.get(0, i);
        double rho = data[0];
        double theta = data[1];
        double cosTheta = Math.cos(theta);
        double sinTheta = Math.sin(theta);
        double x0 = cosTheta * rho;
        double y0 = sinTheta * rho;
        Point pt1 = new Point(x0 + 10000 * (-sinTheta), y0 + 10000 * cosTheta);
        Point pt2 = new Point(x0 - 10000 * (-sinTheta), y0 - 10000 * cosTheta);
        Imgproc.line(im, pt1, pt2, new Scalar(0, 0, 200), 3);
    
    Imgcodecs.imwrite("C:/Users/valer/eclipse-workspace/thesis-application/StartHere/resource/process/line_output.jpg", im);

我尝试过使用阈值参数,但我一直得到相同(有时是最差)的结果。 谁能指出我哪里做错了?

【问题讨论】:

【参考方案1】:

在行矩阵结果中,行是按行而不是按列存储的。 因此 lines.rows() 为您提供行数,您可以使用 lines.get(i, 0) 进行迭代以获取每一行。

【讨论】:

以上是关于OpenCV HoughLine 仅检测图像中的一行的主要内容,如果未能解决你的问题,请参考以下文章

如何定义阈值以仅检测图像中的绿色对象:Opencv [重复]

OpenCV 的 HoughLines 以啥顺序列出 [rho,theta] 矩阵中检测到的线?

OpenCV Houghline 函数创建无限线

如何在opencv中检测仅包含文本的图像是不是模糊

OpenCV3.3 深度学习模块-对象检测演示

OpenCV:获取 3 通道 RGB 图像,分割通道并仅使用 R+G 查看图像