java - 如何在 Java 中使用 OpenCV 检测图像中的线条

标签 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());

最佳答案

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

问题是您正在尝试从看起来像这样的图像中提取线条: 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

关于java - 如何在 Java 中使用 OpenCV 检测图像中的线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40045981/

相关文章:

java - SmartGWT 数据源字符串 XML

java - 我怎样才能得到底部结果?

opencv - CMakeLists.txt CMAKE_PREFIX_PATH 处的 CMake 错误

java - 我需要安装 opencv 并在 Maven+IntelliJ(在 Windows 和 macOS/OSX 上)中通过 java 使用它。

java - onClickListener 导致应用程序崩溃

Java JTable 交替行颜色不起作用

c++ - inpaint() 没有产生预期的结果。为什么?

image-processing - Haar 训练时正样本和负样本使用多少图像?

opencv - 在 OpenCV 中寻找小轮廓

java - 重复类 org.apache.commons.logging