浏览FindContours方法找到的轮廓层次结构?

时间:2016-05-24 08:44:31

标签: c# opencv emgucv contour opencv-contour

对于直接使用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[,])。

1 个答案:

答案 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对象访问轮廓本身。