EmguCv提取轮廓与绘制轮廓

private void button1_Click_1(object sender, EventArgs e)
        {
            if (ib_original.Image != null)
            {
                Mat src = new Image<Bgr, byte>(ib_original.Image.Bitmap).Mat;
                Mat dst = new Mat();

                //Canny 边缘检测算子
                CvInvoke.Canny(src, dst, 120, 180);

                //创建用于存储轮廓的VectorOfVectorOfPoint数据类型
                //需要添加引用命名空间Emgu.CV.Util
                VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();

                //IOutputArray contours:检测到的轮廓。通常使用VectorOfVectorOfPoint类型。
                //IOutputArray hierarchy:可选的输出向量,包含图像的拓扑信息。不使用的时候可以用 null 填充。
                //每个独立的轮廓(连通域)对应 4 个 hierarchy元素 hierarchy[i][0]~hierarchy[i][4]
                //(i表示独立轮廓的序数)分别表示后一个轮廓、前一个轮廓、父轮廓、子轮廓的序数。

                //RetrType mode标识符及其解析:
                //External = 0 提取的最外层轮廓;
                //List = 1 提取所有轮廓
                //Ccomp = 2 检索所有轮廓并将它们组织成两级层次结构:水平是组件的外部边界,二级约束边界的洞。
                //Tree = 3 提取所有的轮廓和建构完整的层次结构嵌套的轮廓。

                //ChainApproxMethod表示轮廓的逼近方法
                //ChainCode = 0 Freeman链码输出轮廓。所有其他方法输出多边形(顶点序列)。
                //ChainApproxNone = 1 所有的点从链代码转化为点;
                //ChainApproxSimple = 2 压缩水平、垂直和对角线部分,也就是说, 只剩下他们的终点;
                //ChainApproxTc89L1 = 3 使用The - Chinl 链逼近算法的一个
                //ChainApproxTc89Kcos = 4 使用The - Chinl 链逼近算法的一个
                //LinkRuns = 5, 使用完全不同的轮廓检索算法通过链接的水平段的1s轨道。
                //用这种方法只能使用列表检索模式。

                CvInvoke.FindContours(dst, contours, null, Emgu.CV.CvEnum.RetrType.External,
                    Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);

                //获取一张背景为黑色的图像,大小与原图相同
                Mat mask = src.ToImage<Bgr, byte>().CopyBlank().Mat;

                //用红色画笔在mask图像中画出所有轮廓
                //int contourIdx:绘画轮廓的序号。如果为负数表示绘画出全部轮廓。一般为-1。
                //MCvScalar color:画笔的颜色。
                //int thickness = 1:画笔的宽度。
                //LineType lineType = LineType.EightConnected:Emgu.CV.Cvenum 枚举类型标识符,
                //表示绘画线条的类型,默认 8 连通类型。
                //FourConnected = 4 4连通类型
                //eightConnected = 8 8连通类型
                //AntiAlias = 16 消除锯齿
                CvInvoke.DrawContours(mask, contours, -1, new MCvScalar(0, 0, 255));

                ib_result.Image = mask;
            }
        }

猜你喜欢

转载自blog.csdn.net/xjjatdna/article/details/85416502