求出轮廓的周长进行筛选并绘制轮廓

来源:互联网 发布:捕鱼刷分软件 编辑:程序博客网 时间:2024/06/04 18:33

代码:

            OpenFileDialog of = new OpenFileDialog();
            if (of.ShowDialog() != DialogResult.OK)
            { return; }
            Image<Gray, byte> img = new Image<Gray, byte>(of.FileName);
            Mat dst1 = new Mat();
            CvInvoke.Canny(img, dst1, 120, 180);//查找轮廓 
            imageBox2.Image = dst1;
            VectorOfVectorOfPoint vvp = new VectorOfVectorOfPoint();
            VectorOfVectorOfPoint use_vvp = new VectorOfVectorOfPoint();
            CvInvoke.FindContours(dst1, vvp, null, Emgu.CV.CvEnum.RetrType.External/*提取最外层轮廓,经常使用也有取所有轮廓List*/, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);//轮廓提取
            int number = vvp.ToArrayOfArray().Length;//取得轮廓的数量.
            for (int i = 0; i < number; i++)
            {
                VectorOfPoint vp = vvp[i];
                double lengch = CvInvoke.ArcLength(vp,false);//计算周长
                if (lengch > 100)//以实际的图片按周长进行筛选
                { use_vvp.Push(vp); }


            }
            Mat result = new Mat(img.Size, Emgu.CV.CvEnum.DepthType.Cv8U, 3);
            result.SetTo(new MCvScalar(0, 0, 0));
            CvInvoke.DrawContours(result, use_vvp, -1, new MCvScalar(0, 255, 0));//绘制轮廓
            imageBox3.Image = result;
            imageBox1.Image = img;


API:

        /// <summary>
        /// Canny算法查找输入图像上的轮廓查找
        /// </summary>
        /// <param name="image">源图</param>
        /// <param name="edges">输出图像</param>
        /// <param name="threshold1">第一个阈值</param>
        /// <param name="threshold2">第二个阈值</param>
        /// <param name="apertureSize">光圈大小:用Sobel算子孔径参数(默认)</param>
        /// <param name="l2Gradient">一个标志位,指示是否应该使用一个更精确的规范来计算图像的梯度幅值(l2gradient = true),或是默认(l2gradient = false)</param>
        // public static void Canny(IInputArray image, IOutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool l2Gradient = false);


        /// <summary>
        /// 提取轮廓
        /// </summary>
        /// <param name="image">输入一个二进制的图像</param>
        /// <param name="contours">输出的是一个轮廓图像</param>
        /// <param name="hierarchy">可选择的输出向量,包含图像的拓扑信息不使用的时候可以用null填充,每个独立的轮廓(连通域)对应4个hieratchy元素</param>
        /// <param name="mode">枚举类型  轮廓检索模式</param>
        /// <param name="method">枚举类型 轮廓近似方法</param>
        /// <param name="offset">每个轮廓 点的偏移量,对RoI图像中长出轮廓,并要在整片中分析,那第就会使用到这个偏移量</param>
        // public static void FindContours(IInputOutputArray image, IOutputArray contours, IOutputArray hierarchy, RetrType mode, ChainApproxMethod method, Point offset = null);
        public enum RetrType
        {//轮廓检索模式 
            // 提取最外层轮廓
            External = 0,
            //  提取所有轮廓
            List = 1,
            //检索所有的轮廓并将它们组织到两个级别的层次结构:水平是组件的外部边界,二级约束边界的洞.
            Ccomp = 2,
            //   提取所有的轮廓和建构完整的层次结构嵌套的轮廓.
            Tree = 3,
        }
        public enum ChainApproxMethod//轮廓近似方法
        {
            //Freeman链码输出轮廓,所有其他多边形(顶点序列)
            ChainCode = 0,
            //所有的点从链代码转化为点.
            ChainApproxNone = 1,
            //压缩水平、垂直和对角线部分,也就是说只剩下他们的终点.
            ChainApproxSimple = 2,
            //使用The_Chinl链逼近算法的一个
            ChainApproxTc89L1 = 3,
            //使用The_Chinl链逼近算法的一个
            ChainApproxTc89Kcos = 4,
            //使用完全不同的轮廓检索算法通过链接的水平段的1S轨道,用这种方法只能使用列表检索模式.
            LinkRuns = 5,
        }

        /// <summary>
        /// 返回double类型的长度
        /// </summary>
        /// <param name="curve">输入计算周长的轮廓,类型为VectorOfPoint</param>
        /// <param name="isClosed">表示计算周长的轮廓是否封闭.isClosed=true:计算封闭轮廓 的周长</param>
        /// <returns></returns>
       // public static double ArcLength(IInputArray curve, bool isClosed);


        /// <summary>
        /// 绘制轮廓
        /// </summary>
        /// <param name="image">输入一个图片,也是传出来的图片</param>
        /// <param name="contours">new VectorOfVectorOfPoint</param>
        /// <param name="contourIdx">-1为绘制所有轮廓</param>
        /// <param name="color">绘制轮廓的颜色</param>
        /// <param name="thickness">线宽</param>
        /// <param name="lineType"></param>
        /// <param name="hierarchy"></param>
        /// <param name="maxLevel"></param>
        /// <param name="offset"></param>
        //public static void DrawContours(IInputOutputArray image, IInputArrayOfArrays contours, int contourIdx, MCvScalar color, int thickness = 1, LineType lineType = LineType.EightConnected, IInputArray hierarchy = null, int maxLevel = 2147483647, Point offset = null);
       
      


0 0
原创粉丝点击