Перейти к содержимому
Compvision.ru
kazanOpenCV

Вопрос по findContours

Recommended Posts

Доброго времени суток,

возникла проблема с findContours. Вопрос в следующем:

есть квадрат: contours[1]([4]({x=10 y=10 },{x=110 y=10 },{x=110 y=110 },{x=10 y=110 })).

Рисуем его на белом фоне черным цветом с черной заливкой. Убираем грани, т.е. уменьшаем каждую сторону квадрата на толщину 1 пиксел.

С помощью cv::findContours( empty_image, contours_optimized,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); находим все контура на картинке, получаем:

[0] [8]({x=10 y=11 },{x=11 y=10 },{x=109 y=10 },{x=110 y=11 },{x=110 y=109 },{x=109 y=110 },{x=11 y=110 },{x=10 y=109 }) - искомый контур.

[1] [4]({x=1 y=1 },{x=1 y=1078 },{x=1918 y=1078 },{x=1918 y=1 }) - контур по периметру картинки

Вопрос, почему найденный контур [8]({x=10 y=11 },{x=11 y=10 },{x=109 y=10 },{x=110 y=11 },{x=110 y=109 },{x=109 y=110 },{x=11 y=110 },{x=10 y=109 }) отличается от [4]({x=10 y=10 },{x=110 y=10 },{x=110 y=110 },{x=10 y=110 })??

Т.е почему он находит контур как на рис.1, а не как на рис.2 строгий квадрат?

post-5772-0-24046900-1365015665_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

CV_CHAIN_APPROX_NONE - попробуйте без аппроксимации сделать в findContours

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это видимо связано с установленным типом связности (4 или 8). У Вас, похоже, 8 - связные соседи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

kilop, мне нужно чтобы прямые участки контура представлялись не поточечно, а отрезками, как раз для этого использую CV_CHAIN_APPROX_SIMPLE.

Smorodov, а как мне тип связности поменять на 4?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

если findContours с CV_CHAIN_APPROX_NONE выдаст нормальные точки в углах, то потом можно самому точки преобразовать с 4-х связностью в отрезки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

если findContours с CV_CHAIN_APPROX_NONE выдаст нормальные точки в углах, то потом можно самому точки преобразовать с 4-х связностью в отрезки.

mrgloom, так я и использовал CV_CHAIN_APPROX_SIMPLE, чтобы исключить ручную обработку точек контура на предмет исключения прямых отрезков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×