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[,]).
要获得轮廓的层次结构,必须首先将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] 是同一层次结构级别(具有相同父级别)的下一个轮廓的索引,如果不存在则为-1hierachy[0,i,1] 是同一层次结构级别的上一个轮廓的索引,如果不存在,则为-1hierachy[0,i,2]是轮廓子的索引,i如果不存在则为-1hierachy[0,i,3]是轮廓的父级索引,i如果不存在则为-1这就是你使用层次结构对象的方式.
outputResult通过使用它们的索引,可以通过对象访问轮廓本身.