如何用Java中的OpenCV检测图像中的线条

时间:2016-10-14 14:44:37

标签: java opencv

我有教程中的代码,我想检测图像中的直线。 我有这个代码,但对于1行HoughLinesP生成数百个点而不是2个点(起点和终点 - [x1,y1]和[x2,y2])。 即使我使用空图像,我得到99分...... 非常感谢你们。

    Mat src = Highgui.imread("C:/Users/Daniel/Desktop/line.png",Highgui.CV_LOAD_IMAGE_COLOR);
    Mat lines = new Mat();
    Mat grey = new Mat();

    Imgproc.cvtColor(m, grey, Imgproc.COLOR_BGR2GRAY);
    Imgproc.HoughLinesP(grey, lines, 1, Math.PI / 180, 50, 50, 10);

    for (int x = 0; x < lines.cols(); x++) 
      {
            double[] vec = lines.get(0, x);
            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);

            Core.line(grey, start, end, new Scalar(100,100,100), 1);
      }

      //just show image
      new LoadImage("C:/Users/Daniel/Desktop/cdst.jpg",cdst);

      //print matrix of points of all lines - here I get a lot of points for 1 line
      System.out.println(lines.dump());

1 个答案:

答案 0 :(得分:1)

虽然您没有放置示例图像而没有完全描述问题,但我会尝试回答它,因为我知道问题可能是什么(当然,在我的问题中有详细信息之前我无法确定)。< / p>

问题是你试图从一个看起来像这样的图像中提取线条: enter image description here

HoughLinesP期望二进制图像(可能是边缘检测算法的输出),其中线以白色(或二进制图像中的1)表示,背景以黑色(或0)表示。问题是你的图像可能具有相反的表示,这使得函数提供了太多的输出行。你想要的是这样的: enter image description here

这是使用HoughLinesP来获取行方程的C ++代码。

#include <iostream>
#include <cv.h>
#include <highgui.h>



int main()
{
    cv::Mat inImage = cv::imread("savedPng.png");

    cv::Mat ginImage;
    cv::cvtColor(inImage, ginImage, CV_BGR2GRAY);

    cv::vector<cv::Vec4i> lines;
    cv::HoughLinesP(ginImage, lines, 1, CV_PI/180, 50, 50, 10 );

    for( size_t i = 0; i < lines.size(); i++ )
    {
        cv::Vec4i l = lines[i];
        std::cout << "( " << l[0]<< ", " << l[1]<< std::endl;
        std::cout << "( " << l[2]<< ", " << l[3] << std::endl;
        std::cout << "***********"<< std::endl;

    }
     return 1;
}

这是输出:

( 103, 294
( 600, 41
***********
( 105, 294
( 601, 42
***********
( 102, 294
( 600, 40
***********
( 112, 292
( 601, 43
***********
( 105, 291
( 416, 133
***********
( 445, 123
( 601, 44
***********

显示检测到的行的输出图像: enter image description here