#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. Если вы проголосуете против, пожалуйста, также потратьте время, чтобы написать, что можно улучшить в этом ответе.