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

来源:互联网 发布:罗马帝国艳情史 知乎 编辑:程序博客网 时间:2024/05/22 11:32

这篇博客需要用的上篇博客用的轮廓寻找的数据 链接
所使用的函数为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;        }    }

运行图:
这里写图片描述

0 0