使用EmguCv计算包围物体的最小圆与最小可旋转矩形和不可选择矩形

这篇博客需要用的上篇博客用的轮廓寻找的数据 链接
所使用的函数为BoundingRectangle、MinEnclosingCircle、MinAreaRect。
这三者所使用的参数并不一样,BoundingRectangle函数的参数为检测到的直接数据。
其他两个均为转化得来的PointF数组。
图片中分块的多个图形也可以检测的到。
有了上篇博客的基础,这个并不难。

代码:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Image<Bgr, byte> a = new Image<Bgr, byte>("9660416_102608612175_2.jpg");
            Image <Gray, byte> b = new Image<Gray, byte>(a.Width, a.Height);        //边缘检测
            Image<Gray, byte> c = new Image<Gray, byte>(a.Width, a.Height);         //用于寻找轮廓 
            Image<Bgr, byte> d = new Image<Bgr, byte>(a.Width, a.Height);           //用于绘制轮廓
            CvInvoke.Canny(a, b, 100, 60);
            VectorOfVectorOfPoint con = new VectorOfVectorOfPoint();
            CvInvoke.FindContours(b, con, c, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);

            Point[][] con1 = con.ToArrayOfArray();
            PointF[][] con2 = Array.ConvertAll<Point[], PointF[]>(con1, new Converter<Point[], PointF[]>(PointToPointF));
            for (int i = 0; i < con.Size; i++)
            {
                Rectangle rec = CvInvoke.BoundingRectangle(con[i]);    //红色

                CircleF cir = CvInvoke.MinEnclosingCircle(con2[i]);     //蓝色

                RotatedRect rrec = CvInvoke.MinAreaRect(con2[i]);       //绿色

                PointF[] pointfs = rrec.GetVertices();
                for (int j = 0; j < pointfs.Length; j++)
                    CvInvoke.Line(a, new Point((int)pointfs[j].X, (int)pointfs[j].Y), new Point((int)pointfs[(j + 1) % 4].X, (int)pointfs[(j + 1) % 4].Y), new MCvScalar(0, 255, 0, 255), 4);

                CvInvoke.Rectangle(a, rec, new MCvScalar(0, 0, 255, 255), 4);
                CvInvoke.Circle(a, new Point((int)cir.Center.X, (int)cir.Center.Y), (int)cir.Radius, new MCvScalar(255, 0, 0, 255), 4);
            }
            for (int i = 0; i < con.Size; i++)
                CvInvoke.DrawContours(d, con, i, new MCvScalar(255, 0, 255, 255), 2);

            imageBox1.Image = a.ConcateVertical(d);
        }
        public static PointF[] PointToPointF(Point[] pf)
        {
            PointF[] aaa = new PointF[pf.Length];
            int num = 0;
            foreach(var point in pf)
            {
                aaa[num].X = (int)point.X;
                aaa[num++].Y = (int)point.Y;
            }
            return aaa;
        }
    }

运行图:

你可能感兴趣的:(EmguCV)