Навигация по иерархии контуров, найденных методом 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
объект с помощью своих индексов.