OpenCV Python中hierarchy = hierarchy[0]的含义及代码转C#咨询
我来帮你拆解这段Python代码的逻辑,以及对应的C#转换思路,毕竟跨语言转OpenCV确实容易踩坑~
先搞懂Python OpenCV里的
cv2.findContours返回值 在旧版OpenCV(比如3.x系列)中,cv2.findContours会返回三个值:
_:这个是处理后的输入图像(早期OpenCV会修改输入的edges图像),但Python里常用下划线表示“这个值我暂时用不上,不用给它起名字”,新版OpenCV已经改成输入只读,这个返回值就更没用了。contours:这是找到的所有轮廓的列表,每个轮廓是一组点的数组,用来描述轮廓的形状。hierarchy:这个是轮廓的层级信息,它是一个三维数组,形状是(1, N, 4)——其中N是找到的轮廓总数,每个轮廓对应的层级条目有4个值:[next, prev, child, parent],分别代表:next:同层级下一个轮廓的索引(没有则为-1)prev:同层级上一个轮廓的索引(没有则为-1)child:当前轮廓的第一个子轮廓的索引(没有则为-1)parent:当前轮廓的父轮廓的索引(没有则为-1)
为什么要写hierarchy = hierarchy[0]?
因为这个三维数组的第一个维度(索引0)是多余的“包装层”,实际有用的是里面的N个层级条目。执行这行代码后,hierarchy就从(1, N, 4)的三维数组变成了(N, 4)的二维数组,后续遍历每个轮廓的层级信息时,直接用hierarchy[i]就能拿到第i个轮廓的层级数据,不用多写一层索引,方便很多。
对应的C# OpenCV处理方式
如果用的是OpenCVSharp(目前最常用的C# OpenCV绑定库),Cv2.FindContours的返回逻辑更直接,不需要额外的降维操作:
// 假设edges是已经处理好的二值图像 Point[][] contours; HierarchyIndex[] hierarchy; // 对应Python里的cv2.RETR_TREE和cv2.CHAIN_APPROX_SIMPLE Cv2.FindContours(edges, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);
这里的hierarchy是一个一维数组,每个元素hierarchy[i]就是第i个轮廓的层级信息,它的Next、Previous、Child、Parent属性,完全对应Python里hierarchy[0][i]的四个值。
补充小提示
- Python里的
cv2.RETR_TREE对应C#的RetrievalModes.Tree,cv2.CHAIN_APPROX_SIMPLE对应ContourApproximationModes.ApproxSimple,参数是一一对应的。 - 如果用的是其他C# OpenCV库,核心逻辑也差不多:C#版本的findContours返回的层级信息已经是直接可用的一维结构,不需要像Python那样做
hierarchy[0]的降维操作。
内容的提问来源于stack exchange,提问作者MigfibOri
相关产品推荐
相关产品推荐

