Как обнаружить несвязанный прямоугольник - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь определить поле, похожее на символ, и постобработанное изображение выглядит так.

preprocessed image

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

 cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5,5));
 cv::morphologyEx(frame, frame, cv::MORPH_DILATE, element);
 cv::morphologyEx(frame, frame, cv::MORPH_ERODE, element);

После использования findcontour картинка выглядит следующим образом

std::vector<std::vector<cv::Point> > contours;
std::vector< cv::Vec4i > hierarchy;

cv::findContours(frame, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);

contour

Не совсем неожиданно здесь, поскольку есть несколько пробелов, которые не являются близкими. Когда я пытаюсь приближение к apolipDP, контур при проверке вершин = 4 и проверка функции isContourConvex завершается неудачей ... (опять же, в некотором ожидании)

Я мог использовать minRectArea только для того, чтобы весь контур был прямоугольником.

 tempCandidate.push_back(cv::minAreaRect(cv::Mat(contours[i])));

Кажется, это работает для этого примера, но у меня есть более шумное изображение для обработки.

  1. Какую еще стратегию предварительной обработки я могу использовать, чтобы закрыть границу?
  2. как я могу убедиться, что область, которую я заключаю с помощью miniRectArea, является прямоугольником? Я проверяю, используя длину контура, отвечающую минимальным требованиям, и RotatedRect должен иметь определенные углы, дыхание и ширину

  3. Правильно ли я использую findContour?

PS: я не знаю, составляет ли пост один слишком много вопросов. Если это произойдет, я разделю вопросы на несколько постов.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Альтернативой является удаление тонких линий, которые не являются частью рамки (например, путем уменьшения масштаба изображения, поскольку линии кажутся тонкими на 1 пиксель, более тонкими, чем боковые стороны коробки), а затем вычисление выпуклой оболочки того, что осталось. Смотри https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/hull.html

0 голосов
/ 09 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...