EmguCv多边形包围

外接矩形

外接最小面积矩形(旋转矩形)

外接闭合圆形

外接三角形

外接多边形(凸包检测)

//多边形包围
        private void btn_surround_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();
                Image<Bgr, byte> img = new Image<Bgr, byte>(ib_original.Image.Bitmap);

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

                //创建用于存储轮廓的VectorOfVectorOfPoint数据类型
                VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();

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

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

                    string str = ((Button)sender).Text;
                    switch (str)
                    {
                        case "外接矩形":
                            {
                                Rectangle rect = CvInvoke.BoundingRectangle(contour);
                                img.Draw(rect, new Bgr(0, 0, 255), 2);
                            }
                            break;
                        case "外接面积最小矩形":
                            {
                                RotatedRect rrect = CvInvoke.MinAreaRect(contour);
                                img.Draw(rrect, new Bgr(0, 0, 255), 2);
                            }
                            break;
                        case "外接闭合圆形":
                            {
                                CircleF circle = CvInvoke.MinEnclosingCircle(contour);
                                img.Draw(circle, new Bgr(0, 0, 255), 2);
                            }
                            break;
                        case "外接三角形":
                            {
                                VectorOfPoint tri = new VectorOfPoint();//存储三角形
                                double area = CvInvoke.MinEnclosingTriangle(contour, tri);
                                img.Draw(tri.ToArray(), new Bgr(0, 0, 255), 2);
                            }
                            break;
                        case "外接多边形":
                            {
                                //也叫凸包检测
                                VectorOfPoint hull = new VectorOfPoint();//存储凸包点
                                CvInvoke.ConvexHull(contour, hull);
                                img.Draw(hull.ToArray(), new Bgr(0, 0, 255), 2);
                            }
                            break;
                        default:
                            break;
                    }
                }
                ib_result.Image = img;
            }
        }

猜你喜欢

转载自blog.csdn.net/xjjatdna/article/details/85528478
今日推荐