Как определить строку в изображении с помощью OpenCV в 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());
 

Комментарии:

1. Не используйте обнаружение границ, если оно вам не нужно! Если ваше изображение уже представляет собой прямую линию, просто передайте его в цвет (преобразованный в серый)

2. Я пробовал это раньше, но это дает мне странные результаты. Итак, я подумал, что мне нужен хитрый алгоритм. Если я использую код без хитрого алгоритма, я получаю много очков. Если я показываю новое изображение с обнаруженными строками, я вижу изображение со случайными строками. Например, у меня есть изображение с 1 строкой, просто для тестирования. Без Canny он генерирует сотни точек…

3. Начните с генерации промежуточных выходных данных на каждом шаге. Затем загрузите входные изображения, а также промежуточные изображения, чтобы другие пользователи хорошо знали о проблеме. Во-вторых, пишите аналитически. Не пытайтесь обобщить все в одном отрывке. Сообщество воспримет это как хороший признак того, что автор вопроса проделал достаточную работу.

4. Спасибо. Проблема в том, что HoughLinesP обнаруживает слишком много строк. Но есть только одна строка… Поэтому я не могу записать некоторые выходные данные на каждом шаге. Если я использую Canny, HoughLinesP генерирует для меня красивые строки, но края. Спасибо, я действительно благодарен.

5. Можете ли вы добавить изображение, которое вы используете для обнаружения строки?

Ответ №1:

Хотя вы не привели пример изображения и не описали вопрос полностью, я постараюсь ответить на него, потому что я знаю, в чем может быть проблема (конечно, я не могу сказать наверняка, пока не получу полную информацию в вашем вопросе).

Проблема в том, что вы пытаетесь извлечь строки из изображения, которое выглядит примерно так: введите описание изображения здесь

HoughLinesP Ожидается двоичное изображение (возможно, результат алгоритма обнаружения границ), где строки представлены белым цветом (или 1 в двоичном изображении), а фон представлен черным цветом (или 0). Проблема в том, что ваши изображения, возможно, имеют противоположное представление, из-за чего функция выдает слишком много выходных строк. Вместо этого вы хотите что-то вроде этого: введите описание изображения здесь

Вот код C , используемый HoughLinesP для получения уравнения строки.

 #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
***********
 

Выходное изображение, показывающее обнаруженную строку:
введите описание изображения здесь

Комментарии:

1. Если вы проголосуете против, пожалуйста, также потратьте время, чтобы написать, что можно улучшить в этом ответе.