对于直接使用OpenCV的C ++开发人员来说,这一点很简单。但是我正在使用的是Emgu(.NET的OpenCV包装器),在最新版本中,我们让方法CvInvoke.FindContours
返回void,输出结果通过参数引用传递,类型为VectorOfVectorOfPoint
这是一个简单的电话:
//outputResult is a VectorOfVectorOfPoint
CvInvoke.FindContours(inputImage, outputResult, null, RetrType.Tree,
ChainApproxMethod.ChainApproxSimple);
对于RetrType.List
模式,我们可以将结果转换为某些数组,并轻松遍历所有轮廓。然而,在这里,我想浏览树中的所有轮廓。我想我们必须使用指针(通过输出结果的Ptr
属性访问)对本机(不安全)C ++代码执行某些操作。但我想知道是否有更适合.NET的解决方案。如果使用指针是唯一的解决方案,我仍然不知道如何深入研究Ptr
来浏览轮廓树。
安装Emgu的示例代码包含使用CvInvoke.FindContourTree
的代码段(并返回int[,]
)。
答案 0 :(得分:7)
要获取轮廓的层次结构,必须先将Mat
对象传递给函数:
Mat hierarchy = new Mat() ;
CvInvoke.FindContours(inputImage, outputResult, hierarchy, RetrType.Tree,
ChainApproxMethod.ChainApproxSimple);
然后您可以使用hierarchy
对象,如下所示(有关Python OpenCV的更多详细信息,请参阅here):
hierarchy
将是Mat
对象,大小为1 x,outputResult
x 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
对象访问轮廓本身。