Находить выпуклые дефекты?в OpenCV 2.3, c ++ с MS Visual Studio2010 - PullRequest
3 голосов
/ 16 ноября 2011

В настоящее время я пытаюсь использовать OpenCV 2.3 и c ++ для обнаружения руки (в зеленой перчатке) и различения различных жестов рук.

В этот самый момент мой следующий шаг заключается в приобретении специфических функцийруки (выпуклые дефекты).

До сих пор я использовал эти функции в своем процессе:

mixChannels(); //to subtract non-green channels from green. 
threshold(); //to convert to binary
erode(); dialate(); //to get rid of any excess noise
findContours(); //to find contours of course

они работали великолепно, и я смог вывести findContours() с помощью drawContours().

Следующий шаг, и я здесь, использую convexHull(), который также работает в OpenCV 2.3.Однако мне еще предстоит выяснить, как на самом деле выглядят векторные результаты convexHull() (какие функции они содержат).

Но тут начинается сложная часть.

Я обнаружил, что более старая версия OpenCV (использующая c, которая использует IplImage), имеет небольшую аккуратную функцию под названием cvConvexityDefects(), которая можетдать множество недостатков на выпуклой оболочке.Это то, что мне нужно, но, похоже, такой функции нет для OpenCV 2.3, и я не понимаю, как использовать старый синтаксис для получения этих результатов.

Вот ссылка на OpenРезюме документации на cvConvextDefects.

То, о чем я прошу, - это либо аналогичная функция OpenCV 2.3, либо самописный фрагмент кода или алгоритм поиска этих дефектов.Или метод использования старого синтаксиса 2.1 для векторного результата или что-то в этом роде.

(я знаю, что могу использовать другие функции, прямоугольные ограничивающие рамки и подогнанные круги. Но я уверен, что выпуклые дефектывыдает наиболее различимые функции.)

Решение - я закончил тем, что использовал оболочку c ++ из этого поста Единственная вещь, которая не работает для этой оболочки, кажется, это лук вектора дефектов, которыйдолжно быть легко решаемо.

Следующий шаг - получение полезных данных об этих дефектах.(На первый взгляд. Данные кажутся единичными точками на выпуклой оболочке, или на контуре, или на их счетчике. Сначала я ожидал набор из двух точек, или единственной точки, и длины, которая, по-видимому, не является. Если я ударю "кирпичной стеной" этим, я сделаю еще один пост)

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Новый интерфейс C ++ (пока) не поддерживает все функции в C. И наоборот, верно (не все в cpp находится в c).Причины разные, но хорошая новость в том, что вы можете легко использовать любую функцию, какую захотите.Например, здесь вы должны преобразовать контуры в последовательности (CvSeq) и отправить их своей функции.

Более того, метод FindContours является оберткой над cvFindContours.Вы можете назвать это

cvFindContours((IplImage*)matImage, ...);

, а затем напрямую использовать результат.

Другим способом было бы создать красивую, чистую оболочку C ++ поверх cvConvexDefects () и отправить ее в OpenCV.В источнике findContours вы найдете некоторую помощь для этого (обратное преобразование)

2 голосов
/ 17 ноября 2011

Я хотел бы попытаться преобразовать мой вектор выпуклых из синтаксиса c ++ в последовательность, которую вы упомянули, но я не знаю, с чего начать. Не могли бы вы пролить свет на это?

Проверьте этот вопрос здесь, я полагаю, что это входит в него.

Дефекты выпуклости C ++ OpenCv

...