Я хочу получить центр масс круговой формы из бинарного изображения, но выходные данные дают более одного центра масс.
Я использую код из учебного документа OpenCV о моменте изображения и немного изменил его.
К вашему сведению, я использую c ++ API OpenCV.
И вывод:
Я ожидаю, что текстовый вывод даст, возможно, 3 центроида из 3 контуров, но в действительности это 7 контуров (контуры [0], …, контуры [6]).
Какой центроид? Или какой контурной области формы круга?
Затем я изменил код, удалил некоторые контуры (потому что реальная картинка очень шумная, и я просто хочу получить некоторые конкретные контуры, форму круга, поэтому я должен удалить другие контуры, такие как линия и символ), используя:
contours.erase()
Я только хочу получить центроид от контура области от 100 до 500.
Но вывод стал странным ..
Центроиды любят летать куда угодно от своих контуров.
Тогда, тем не менее, есть 5 центроидов из 5 контуров (контуры [0], …, контуры [4]).
Что я должен сделать? Я только хочу получить центр тяжести в форме круга (выше числа 3).
Мне действительно нужен твой совет. Спасибо вам большое! : D
*Извините за мой плохой английский..
Что бы я сделал:
cv::findContours
)Примените собственный фильтр частиц. То есть функция, которая скажет вам, является ли контур действительным. Для этого вам нужно основывать свое решение на морфологических особенностях, таких как
Взгляни на что-нибудь как это иметь наглядные примеры:
Вы можете рассчитать округлость от площади (cv::contourArea
) и периметр (cv::arcLength
) в то время как выпуклость будет включать в себя вычисление выпуклой оболочки (cv::convexHull
).
Этот шаг должен привести к новому вектору, содержащему только допустимые значения (например, круговые контуры).
Ваш contourArea(contours[i], false) < 100
это хорошее начало, но оно не скажет вам, является ли контур кругом.
После этого вы можете рассчитать центр тяжести (и отобразить его) для каждого элемента вашего нового вектора. Есть ли смысл?
Наконец, я бы не стал использовать contours.erase()
для больших векторов. Я думаю, что итеративное стирание — это довольно тяжелая работа для процессора. Вместо этого я бы сохранил хорошие контуры в новом предварительно выделенном векторе. Это, однако, просто деталь производительности.
Других решений пока нет …