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

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

И вывод:

AQ38S.jpg

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

Какой центроид? Или какой контурной области формы круга?

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

contours.erase()

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

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

xnDlZ.jpg

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

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

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

1

Решение

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

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

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

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

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

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

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

0

Другие решения

Других решений пока нет …