OpenCV - найти или получить доступ к контуру фигуры, не окруженному bg, а отделенному только контуром - PullRequest
3 голосов
/ 29 марта 2012

Я пытался найти контур одной фигуры на очень простом фоне, используя OpenCV findContour (я хотел бы использовать синтаксис C ++)Тем не менее, он продолжает делать свой контур контуром, а не самой формой.Я думаю, это из-за белого края, полученного от Кэнни, который не делает форму закрытой.

Случай A: Форма по краю изображения (Это нефактическое входное изображение, но более простое входное изображение для иллюстрации этой проблемы.)

Случай B: фон окружает форму

Существуют основные функции, которые я использовал:

findContours( grayImage, contours, hierarchy, RETR_LIST,CHAIN_APPROX_SIMPLE);
approxPolyDP(Mat(contours.at(largestContourIndex)),poly,3,true);
drawContours(output, contours, largestContourIndex, RGB(250,0,100), -1, 8, hierarchy, 0, Point() );

РЕДАКТИРОВАТЬ: Обнаружение пропускающего края дает нужный мне контур, но мне нужно иметь наилучший приблизительный контур, который я могу получить.

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

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Мне кажется, что искомый контур, вероятно, обнаружен, но вы его не используете.Вместо этого вы используете самый большой контур.Попробуйте построить все найденные контуры по одному и посмотрите, есть ли они там.

Если это не так, попробуйте инвертировать хитрое изображение и повторить процесс.

1 голос
/ 29 марта 2012

Вы пытались поиграть с морфологическими операциями ?

Если ваша основная проблема в том, что получаемый контур находится снаружи объекта, а не внутри, и особенноесли ваш объект сделан из таких четких и в основном правильных форм, то морфология может помочь.

Я знаю, что OpenCV имеет реализации дилатация и эрозия , кака также открытие и закрытие операции.Очень простой подход, который может сработать в вашей ситуации, это просто немного размять форму (может быть 1-2-3 итерации), а затем делать именно то, что вы уже делаете.Надеюсь, тогда вы получите внешние контуры размытой фигуры, которые на самом деле должны быть внутренними контурами исходной фигуры.

Я думаю, что OpenCV на самом деле реализует даже более сложную морфологию, но, как всегда, попробуйтесначала простые вещи: D

0 голосов
/ 01 апреля 2012

Я до сих пор не нашел причину, почему я не могу получить контур формы, но я нашел обходной путь. После эрозии и растяжения мне, в основном, нужно нарисовать границу или прямоугольник на крайних пикселях входного изображения, чтобы фон окружал форму, ...

rectangle(input,Point(0,0),Point(input.cols-1,input.rows-1),Scalar(0,0,0),1,8,0);

... следовательно, позволяя Кэнни нарисовать контур замкнутой формы и придав мне нужный контур. Я все еще пытаюсь успешно инвертировать вывод Канни, как то, что предложил @dvhamme, но он все еще дает мне ошибки. Было бы лучше, если бы кто-то указал, как правильно получить или получить доступ к контуру формы, но спасибо всем за помощь.

...