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

Hop*_*ess 5 c# opencv contour emgucv opencv-contour

对于直接使用OpenCV的C++开发人员来说,这一点很简单.然而我正在使用的是Emgu(.NET的OpenCV包装器),在最新版本中,我们使用CvInvoke.FindContours返回void 的方法,输出结果通过参数引用传递并且是类型VectorOfVectorOfPoint.

这是一个简单的电话:

//outputResult is a VectorOfVectorOfPoint
CvInvoke.FindContours(inputImage, outputResult, null, RetrType.Tree, 
                      ChainApproxMethod.ChainApproxSimple);
Run Code Online (Sandbox Code Playgroud)

对于RetrType.List模式,我们可以将结果转换为某些数组,并轻松遍历所有轮廓.然而,在这里,我想浏览树中的所有轮廓.我想我们必须使用指针(通过Ptr输出结果的属性访问)对本机(不安全)C++代码执行某些操作.但我想知道是否有更适合.NET的解决方案.如果即使使用指针是唯一的解决方案,我仍然不知道如何深入研究Ptr以在轮廓树中导航.

与Emgu安装一起使用的示例代码使用代码片段CvInvoke.FindContourTree(并返回a int[,]).

Sun*_*eef 7

要获得轮廓的层次结构,必须首先将Mat对象传递给函数:

Mat hierarchy = new Mat() ;
CvInvoke.FindContours(inputImage, outputResult, hierarchy, RetrType.Tree, 
                  ChainApproxMethod.ChainApproxSimple);
Run Code Online (Sandbox Code Playgroud)

然后您可以hierarchy按如下方式使用该对象(有关Python OpenCV的更多详细信息,请参阅此处):

hierarchy将是一个Mat大小为1 x outputResultx 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通过使用它们的索引,可以通过对象访问轮廓本身.