EmguCv图像的矩(计算轮廓中心)

//图像的矩,计算图形的中心
        private void btn_moments_Click(object sender, EventArgs e)
        {
            if (ib_original.Image != null)
            {
                Mat src = new Image<Bgr, byte>(ib_original.Image.Bitmap).Mat;
                Mat dst = new Mat();

                CvInvoke.Canny(src, dst, 120, 180);

                VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();

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

                //筛选出面积不为0的轮廓并画出
                VectorOfVectorOfPoint use_contours = new VectorOfVectorOfPoint();

                for (int i = 0; i < contours.Size; i++)
                {
                    //获取独立的连通轮廓
                    VectorOfPoint contour = contours[i];

                    //计算连通轮廓的面积
                    double area = CvInvoke.ContourArea(contour);
                    //进行面积筛选
                    if (area > 0)
                    {
                        //添加筛选后的连通轮廓
                        use_contours.Push(contour);
                    }
                }
                CvInvoke.DrawContours(src, use_contours, -1, new MCvScalar(0, 0, 255));

                //计算轮廓中心并画出
                int ksize = use_contours.Size;

                double[] m00 = new double[ksize];
                double[] m01 = new double[ksize];
                double[] m10 = new double[ksize];
                Point[] gravity = new Point[ksize];//用于存储轮廓中心点坐标
                MCvMoments[] moments = new MCvMoments[ksize];

                for (int i = 0; i < ksize; i++)
                {
                    VectorOfPoint contour = use_contours[i];
                    //计算当前轮廓的矩
                    moments[i] = CvInvoke.Moments(contour, false);

                    m00[i] = moments[i].M00;
                    m01[i] = moments[i].M01;
                    m10[i] = moments[i].M10;
                    int x = Convert.ToInt32(m10[i] / m00[i]);//计算当前轮廓中心点坐标
                    int y = Convert.ToInt32(m01[i] / m00[i]);
                    gravity[i] = new Point(x, y);
                }

                //画出中心点位置
                foreach (Point cent in gravity)
                {
                    CvInvoke.Circle(src, cent, 2, new MCvScalar(0, 0, 255), 2);
                }

                ib_result.Image = src;
            }
        }

猜你喜欢

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