5

这对于直接使用 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 安装附带的示例代码有一个片段 using CvInvoke.FindContourTree(并返回 a int[,])。

4

1 回答 1

7

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

Mat hierarchy = new Mat() ;
CvInvoke.FindContours(inputImage, outputResult, hierarchy, RetrType.Tree, 
                  ChainApproxMethod.ChainApproxSimple);

然后您可以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对象使用它们的索引来访问的。

于 2016-05-26T21:03:20.617 回答