Halcom 发表于 2023-12-7 19:30:58

凸包多边形

凸包多边形https://blog.csdn.net/jimtien/article/details/118360090
public static void ShapeTrans0(Mat Region, out Mat RegionTrans, string Type)
      {
            // 此函数参考GetRegionPoint函数,Mat NonZeros = new Mat();   Cv2.FindNonZero(Region, NonZeros); // 非零点
            // 需要改写
            int ImageWidth = 0;
            int ImageHeight = 0;
            GetImageSize(Region, out ImageWidth, out ImageHeight);
            Mat RectMask = new Mat();
            GenImageConst(out RectMask, "byte", ImageWidth, ImageHeight);
            RegionTrans = new Mat(Region.Height, Region.Width, MatType.CV_8UC1, Scalar.Black);
            GenImageProto(RectMask, out RegionTrans, 0);
            //寻找轮廓            
            //OpenCvSharp.Point[][] contours;
            FindImageContours(Region, out Common.ContoursCC);
            // 将全部的二值化块连在一起
            //Mat RectMask1 = new Mat();
            //GenImageConst(out RectMask1, "byte", ImageWidth, ImageHeight);
            Mat RegionTrans1 = new Mat();
            //GenImageProto(RectMask1, out RegionTrans1, 0);
            //Cv2.ImShow("sf", Region);
            Mat NewRegion = new Mat();
            NewRegion = Region.Clone();
            for (int i = 0; i < Common.ContoursCC.Length - 1; i++)
            {
                GenRegionLine(out RegionTrans1, (int)(Common.ContoursCC.Y), (int)(Common.ContoursCC.X), (int)(Common.ContoursCC.Y), (int)(Common.ContoursCC.X), ImageWidth, ImageHeight);
                OverPaintGray(ref NewRegion, RegionTrans1, RegionTrans1);
            }
            //Cv2.ImShow("sf1", Region);
            FindImageContours(NewRegion, out Common.ContoursCC);
            if (Type.ToLower() == "rectangle2")
            {
                RotatedRect rect0 = Cv2.MinAreaRect(Common.ContoursCC);// 最小外接矩形
                #region
                //float Rowy = rect0.Center.Y;
                //float Colx = rect0.Center.X;
                Rect box = rect0.BoundingRect();
                // 不带角度,所以错误
                //GenRectangle1(out RegionTrans, Double2Int(Rowy - rect0.Size.Width / 2), Double2Int(Colx - rect0.Size.Height / 2), Double2Int(Rowy + rect0.Size.Width / 2), Double2Int(Colx + rect0.Size.Height / 2), ImageWidth, ImageHeight);
                #endregion
                // 带角度
                OpenCvSharp.Point2f[] P = rect0.Points();
                for (int j = 0; j <= 3; j++)
                {
                  Cv2.Line(RegionTrans, (OpenCvSharp.Point)P, (OpenCvSharp.Point)P[(j + 1) % 4], Scalar.White, 3, LineTypes.Link8, 0);
                }
                if (Common.MarginOrFill == 0)
                {
                  //Cv2.Rectangle(RegionTrans, box, Scalar.White, 3, LineTypes.Link8);
                  ;
                }
                else
                {
                  FillUp(RegionTrans, out RegionTrans);
                }
            }
            else if (Type.ToLower() == "rectangle1")
            {
                RotatedRect rect0 = Cv2.MinAreaRect(Common.ContoursCC);// 最小外接矩形
                //float Rowy = rect0.Center.Y;
                //float Colx = rect0.Center.X;
                Rect box = rect0.BoundingRect();
                // 不带角度,所以错误
                //GenRectangle1(out RegionTrans, Double2Int(Rowy - rect0.Size.Width / 2), Double2Int(Colx - rect0.Size.Height / 2), Double2Int(Rowy + rect0.Size.Width / 2), Double2Int(Colx + rect0.Size.Height / 2), ImageWidth, ImageHeight);
                if (Common.MarginOrFill == 0)
                {
                  Cv2.Rectangle(RegionTrans, box, Scalar.White, 3, LineTypes.Link8);
                }
                else
                {
                  Cv2.Rectangle(RegionTrans, box, Scalar.White, -1, LineTypes.Link8);
                }
            }
            else if (Type.ToLower() == "circle")
            {
                OpenCvSharp.Point2f center;//定义圆中心坐标
                float radius = 0.1f;         //定义圆半径
                Cv2.MinEnclosingCircle(Common.ContoursCC, out center, out radius);
                if (Common.MarginOrFill == 0)
                {
                  //Cv2.DrawContours(RegionTrans, contours, 0, Scalar.White, 3, LineTypes.Link8);
                  Cv2.Circle(RegionTrans, (int)center.X, (int)center.Y, (int)radius, Scalar.White, 3, LineTypes.Link8);
                }
                else
                {
                  //Cv2.DrawContours(RegionTrans, contours, 0, Scalar.White, -1, LineTypes.Link8);
                  Cv2.Circle(RegionTrans, (int)center.X, (int)center.Y, (int)radius, Scalar.White, -1, LineTypes.Link8);
                }
            }
            else if (Type.ToLower() == "convex")
            {
                OpenCvSharp.Point[] ContPoint = Cv2.ConvexHull(Common.ContoursCC);
                if (Common.MarginOrFill == 0)
                {
                  for (int j = 0; j < ContPoint.Length; j++)
                  {
                        Cv2.Line(RegionTrans, (OpenCvSharp.Point)ContPoint, (OpenCvSharp.Point)ContPoint[(j + 1) % ContPoint.Length], Scalar.White, 3, LineTypes.Link8, 0);
                  }
                }
                else
                {
                  for (int j = 0; j < ContPoint.Length; j++)
                  {
                        Cv2.Line(RegionTrans, (OpenCvSharp.Point)ContPoint, (OpenCvSharp.Point)ContPoint[(j + 1) % ContPoint.Length], Scalar.White, 1, LineTypes.Link8, 0);
                  }
                  FillUp(RegionTrans, out RegionTrans);
                }
            }
            else
            {
                OpenCvSharp.Point[] ContPoint = Cv2.ConvexHull(Common.ContoursCC);
                if (Common.MarginOrFill == 0)
                {
                  for (int j = 0; j < ContPoint.Length; j++)
                  {
                        Cv2.Line(RegionTrans, (OpenCvSharp.Point)ContPoint, (OpenCvSharp.Point)ContPoint[(j + 1) % ContPoint.Length], Scalar.White, 3, LineTypes.Link8, 0);
                  }
                }
                else
                {
                  for (int j = 0; j < ContPoint.Length; j++)
                  {
                        Cv2.Line(RegionTrans, (OpenCvSharp.Point)ContPoint, (OpenCvSharp.Point)ContPoint[(j + 1) % ContPoint.Length], Scalar.White, -1, LineTypes.Link8, 0);
                  }
                }
            }
            RectMask.Dispose();
            RegionTrans1.Dispose();
            NewRegion.Dispose();
      }


Halcom 发表于 2023-12-8 14:25:24

boundingrect(points)外接正矩形边界
页: [1]
查看完整版本: 凸包多边形