какой из следующих центроидов является центроидом объекта на изображении?

Я хочу получить центр масс формы круга из бинарного изображения, но на выходе получается более одного центра масс. Я использую код из веб-учебника opencv о моменте изображения и немного изменен. К вашему сведению, я использую С++ API OpenCV.

И вывод:

AQ38S.jpg

Я ожидаю, что текстовый вывод даст, возможно, 3 центроида из 3 контуров, но на самом деле 7 контуров (контуры [0], ..., контуры [6]).

Какой из них центроид? Или какая площадь контура формы круга?

Затем я изменил код, удалил некоторые контуры (потому что реальная картинка очень шумная, и я просто хочу получить некоторые определенные контуры, форму круга, поэтому я должен удалить другие контуры, такие как линия и символ), используя:

contours.erase()

Я хочу получить центроид только из контура области от 100 до 500.

Но вывод стал странным..

xnDlZ.jpg

Центроиды как бы улетают куда угодно от своих контуров.
Тогда еще есть 5 центроидов из 5 контуров (контуры[0],...,контуры[4]).

Что мне делать? Я только хочу получить центроид формы круга (выше числа 3). Мне очень нужен твой совет. Большое спасибо! :D

*Извините за мой плохой английский..


person lulu    schedule 18.05.2013    source источник
comment
Привет, может быть, вы можете сделать очень простое двоичное изображение одной формы и попробовать написать код поверх него. Кроме того, это кажется простой проблемой, но трудно помочь вам, не видя вашего кода... Вы хотите 1) найти фигуры, которые являются кругами и 2) найти там центр масс?   -  person Quentin Geissmann    schedule 19.05.2013
comment
@QuentinGeissmann Спасибо за ваш комментарий: D Для первого изображения я использую это код. Для второго изображения я изменил код, поставив if ( contourArea(contours[i], false) < 100 || contourArea(contours[i], false) > 500) {contours.erase(contours.begin()+i); }.   -  person lulu    schedule 19.05.2013
comment
Честно говоря, да, я хочу найти фигуры, которые являются кругами, и получить центр масс. У тебя есть какой-нибудь совет? :D   -  person lulu    schedule 19.05.2013
comment
Вы пытались использовать преобразование Хафа для обнаружения кругов?   -  person Zaphod    schedule 19.05.2013
comment
@Zaphod Спасибо за ваш комментарий. :) У меня есть, и это не работает, потому что это круг, нарисованный от руки, так что он просто похож на круг...   -  person lulu    schedule 21.05.2013


Ответы (1)


Что бы я сделал:

  1. Найдите все контуры (и сохраните их в векторе точки) (cv::findContours)
  2. Примените пользовательский фильтр частиц. То есть функция, которая скажет вам, действителен ли контур. Для этого вам необходимо основывать свое решение на морфологических особенностях, таких как

    • circularity
    • выпуклость
    • соотношение сторон

Взгляните на что-нибудь подобное, чтобы иметь наглядные примеры: вы можете рассчитать округлость из площади (cv::contourArea) и периметра (cv::arcLength), в то время как выпуклость будет включать вычисление выпуклой оболочки (cv::convexHull). Этот шаг должен привести к новому вектору, содержащему только допустимые (например, круговые контуры).

Ваш contourArea(contours[i], false) < 100 — хорошее начало, но он не скажет вам, является ли контур кругом.

После этого вы можете вычислить центр тяжести (и отобразить его) каждого элемента вашего нового вектора. Есть ли смысл?

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

person Quentin Geissmann    schedule 19.05.2013
comment
Извините за поздний ответ. Спасибо, что поделились своими знаниями. это очень полезно и полезно, потому что действительно решает мои проблемы. Я проверил это в своем коде, и он работает! Извините, но я действительно новичок в обработке изображений. Я действительно счастлив! Итак, большое спасибо. :) - person lulu; 21.05.2013