Это должно быть просто для разработчиков C++, использующих OpenCV напрямую. Однако то, что я использую, является Emgu (оболочка OpenCV для .NET), и в последней версии мы имеем метод CvInvoke.FindContours
, возвращающий void, выходной результат передается параметром и имеет тип VectorOfVectorOfPoint
.Перейдите по иерархии контуров, найденных методом FindContours?
Вот простой вызов:
//outputResult is a VectorOfVectorOfPoint
CvInvoke.FindContours(inputImage, outputResult, null, RetrType.Tree,
ChainApproxMethod.ChainApproxSimple);
Для RetrType.List
режима, мы можем просто преобразовать результат в какой-то массив массивов и перебора всех контуров легко. Однако здесь я хотел бы перемещаться по всем контурам в дереве. Я предполагаю, что мы должны что-то сделать с собственным (небезопасным) кодом C++ здесь с указателем (доступ через свойство Ptr
результата вывода). Но мне интересно, есть ли для этого более удобное для .NET решение. И если даже использование указателя - единственное решение, я до сих пор не знаю, как вникать в этот Ptr
для навигации по дереву контуров.
В примерах кодов, сопровождаемых установкой Emgu, есть фрагмент с использованием CvInvoke.FindContourTree
(и который возвращает int[,]
).
Разве иерархия не выводится в третьем параметре, который вы задали равным нулю? Вы можете перечислить счетчики точно так же, используете ли вы RetrType.List или Tree, чтобы получить информацию о иерархии, создать новую переменную типа Mat и передать ее в качестве третьего параметра (который теперь является нулевым). – Evk
@ Evk Да, я не понимал, что то, что я должен пройти, находится на третьей позиции, и даже если бы я знал об этом, я бы не знал, что это за тип. Теперь вы дайте мне знать, что я должен пройти в «Мат». Но я просто пытаюсь найти больше об этом типе, и у него нет никаких простых для распознавания членов, чтобы помочь перемещаться по дереву. Если возможно, пожалуйста, дайте мне пример кода в вашем ответе. Это было бы очень признательно. Спасибо! – Hopeless