Как избежать использования System.Drawing Point в MorphologyEx и ApproxContour? - PullRequest
0 голосов
/ 05 июня 2019

У меня проблема, мне нужно найти рисунок на изображении, но я не могу использовать System.Drawing, так как он вступает в конфликт с mono.android.Я использую его только при применении морфологической операции и при попытке найти контуры.Как я могу избежать их использования?

Я уже пытался заменить System.Drawing Points системой System.Windows и android.graphics.point, но я не получил результатов.

Код: '' '

static void Main(string[] args)
        {
            Mat img = CvInvoke.Imread("C:\\Users\\franc\\Desktop\\VP\\1.jpg", 
            Emgu.CV.CvEnum.ImreadModes.AnyColor);
            UMat uimage = new UMat();
            CvInvoke.CvtColor(img, uimage, ColorConversion.Bgr2Gray);
            UMat pyrDown = new UMat();
            double cannyThresholdLinking = 20; //def 120.0
            double cannyThreshold = 300; //def 180.0
            UMat cannyEdges = new UMat();
            CvInvoke.Canny(uimage, cannyEdges, cannyThreshold, 
            cannyThresholdLinking);

            Matrix<byte> kernel2 = new Matrix<byte>(new Byte[3, 3] { { 0, 1, 0 
             }, { 1, 0, 1 }, { 0, 1, 0 } });
            UMat opened = new UMat();
            CvInvoke.MorphologyEx(cannyEdges, opened, MorphOp.Dilate, kernel2, 
             new Point(-1, -1), 1, BorderType.Default, new MCvScalar());
            //ImageViewer.Show(opened);
            UMat inverted = new UMat();
            CvInvoke.BitwiseNot(opened, inverted, null);
            //ImageViewer.Show(inverted);

            UMat labels = new UMat();

            CvInvoke.ConnectedComponents(inverted, labels, 
            LineType.EightConnected);




            LineSegment2D[] lines = CvInvoke.HoughLinesP(inverted, 1, Math.PI / 
            45.0, 20, 30, 10);
            List<RotatedRect> boxList = new List<RotatedRect>();

            using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
            {
                CvInvoke.FindContours(inverted, contours, null, RetrType.List, ChainApproxMethod.ChainApproxSimple);
                //CvInvoke.FindContours(cannyEdges, contours, null, RetrType.List, ChainApproxMethod.ChainApproxSimple);

                int count = contours.Size;
                for (int i = 0; i < count; i++)
                {
                    using (VectorOfPoint contour = contours[i])
                    using (VectorOfPoint approxContour = new VectorOfPoint())
                    {
                        CvInvoke.ApproxPolyDP(contour, approxContour, CvInvoke.ArcLength(contour, true) * 0.05, true);
                        if (CvInvoke.ContourArea(approxContour, false) > 50) //only consider contours with area greater than 250
                        {
                            if (approxContour.Size == 4) //The contour has 4 vertices.
                            {
                                #region 
                                bool isRectangle = true;
                                Point[] pts = approxContour.ToArray();
                                LineSegment2D[] edges = PointCollection.PolyLine(pts, true);

                                for (int j = 0; j < edges.Length; j++)
                                {
                                    double angle = Math.Abs(
                                        edges[(j + 1) % edges.Length].GetExteriorAngleDegree(edges[j]));
                                    if (angle < 80 || angle > 100)
                                    {
                                        isRectangle = false;
                                        break;
                                    }
                                }
                                if (isRectangle) boxList.Add(CvInvoke.MinAreaRect(approxContour));
                            }
                        }
                    }
                }
            }
            #endregion

' ''

...