2012-07-02 1 views
5

Я пытаюсь использовать функцию findcontours() в OpenCV на изображении ниже.OpenCV findcontours возвращает 2 контура для каждого круга

findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE, cvPoint(0,0));

Когда я делаю запрос: contours.size() возвращает 18, так что кажется, 2 контура для каждого круга. Круги - это как вы видите 1-пиксельную толщину, как 2 контура? Это одно для внешнего и одно для внутреннего, если да, то как я могу заставить эту функцию обнаруживать только один контур для каждого круга? Я думал, что контур определяется как связанная последовательность пикселей с толщиной в 1 пиксель.

Says there are 18 contours!!

ответ

4

Я не могу подтвердить это, но я думаю, что алгоритм, используемый этой функцией делает что-то эквивалентное вычисление градиента для каждой функции. Это означает, что на внешнем краю будет контур, а другой - на внутреннем краю, как и вы. Чтобы подтвердить это, Вы можете попытаться использовать входное изображение, где круги были заполнены с белым (elimininating внутреннего контура)

вы также можете проверить с различными параметрами на findContours функционирует

Например, попробуйте используя CV_RETR_EXTERNAL вместо CV_RETR_TREE Я предполагаю, что внутренний круг вложен внутри внешней один, так что это должно заставить его возвращать только те внешние

+0

Но когда я смотрю на этот пример [здесь] (http://jmpelletier.com/a-simple-opencv-tutorial/), кажется, что он не считает внутреннее и внешнее отдельно. Но в качестве примера есть версия версии findcontours. Есть ли разница между старой и новой версиями? –

+0

Нет, не должно быть никаких различий между версией C и C++, которая повлияла бы на конечный результат. Фактически, из того, что я помню, это просто оболочка для другого. Однако, глядя на изображения с этой ссылки, я вижу полную противоположность тому, что вы сказали. он, кажется, обнаруживает как внутренний, так и внешний контур для каждого круга, что делает еще больше смысла на изображении, показанном там – Naps62

+1

Действительно, использование флага CV_RETR_EXTERNAL должно исправить его для вас. См. Здесь полный список флагов: http://opencv.itseez.com/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#void findContours (изображение InputOutputArray, контуры OutputArrayOfArrays, иерархия OutputArray, int mode, метод int, смещение точки) –

0

Вы могли бы уже понял это, но ...

findContours относится только к белым объектам и поэтому распознает каждый из выдолбленного круга как полосу, таким образом, создает два контура.

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