2016-10-14 3 views
0

У меня есть код из учебника, и я хочу определить прямые линии на изображении. У меня есть этот код, но для 1 строки HoughLinesP генерирует сотни точек вместо 2 точек (начальная точка и конечная точка - [x1, y1] и [x2, y2]). Даже если я использую пустое изображение, я получаю 99 баллов ... Спасибо вам большое.Как обнаружить строку в изображении с помощью OpenCV в Java

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()); 
+0

Не используйте обнаружение края, если она не нужна! Если ваше изображение уже является прямой линией, просто передайте его Hough (преобразован в серый) – Miki

+0

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

+0

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

ответ

1

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

Проблема заключается в том, что вы пытаетесь извлечь строки из образа, который выглядит kindof так: enter image description here

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

Вот код 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 
*********** 

Результирующее изображение показывает найденную строку: enter image description here

+0

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