Навигация по иерархии контуров, найденных методом FindContours?

Это должно быть просто для разработчиков C++, использующих OpenCV напрямую. Однако я использую Emgu (оболочку OpenCV для.NET), и в последней версии у нас есть метод CvInvoke.FindContours возвращая void, выходной результат передается по ссылке на параметр и имеет тип VectorOfVectorOfPoint,

Вот простой вызов:

//outputResult is a VectorOfVectorOfPoint
CvInvoke.FindContours(inputImage, outputResult, null, RetrType.Tree, 
                      ChainApproxMethod.ChainApproxSimple);

За RetrType.List В режиме, мы можем просто преобразовать результат в некоторый массив массивов и легко перебрать все контуры. Однако здесь я хотел бы перемещаться по всем контурам в дереве. Я думаю, что мы должны сделать что-то с собственным (небезопасным) кодом C++ здесь с указателем (доступ через Ptr свойство выходного результата). Но мне интересно, есть ли более.NET-дружественное решение для этого. И если даже использование указателя является единственным решением, я до сих пор не знаю, как вникать в это Ptr перемещаться по дереву контуров.

Образцы кодов, сопровождающие установку Emgu, имеют фрагмент с использованием CvInvoke.FindContourTree вместо этого (и это возвращает int[,]).

1 ответ

Чтобы получить иерархию контуров, вы должны сначала передать Mat Объект для функции:

Mat hierarchy = new Mat() ;
CvInvoke.FindContours(inputImage, outputResult, hierarchy, RetrType.Tree, 
                  ChainApproxMethod.ChainApproxSimple);

Тогда вы можете использовать hierarchy Объект следующим образом (подробнее см. здесь в Python OpenCV):

hierarchy будет Mat объект размером 1 х размер outputResult х 4. Так для контура с индексом i:

  • hierachy[0,i,0] является индексом следующего контура на том же уровне иерархии (с тем же родителем) или - 1, если он не существует
  • hierachy[0,i,1] является индексом предыдущего контура на том же уровне иерархии или - 1, если он не существует
  • hierachy[0,i,2] это индекс дочернего контура i или - 1, если он не существует
  • hierachy[0,i,3] является индексом родителя контура i или - 1, если он не существует

Вот как вы используете объект иерархии.

Сами контуры доступны через outputResult объект с помощью своих индексов.

Другие вопросы по тегам