コード例 #1
0
ファイル: Sanitizer.cs プロジェクト: SKKbySSK/ProCon28_CS
        void UpdateHierarchy(List <HierarchyIndex> hierarchy)
        {
            int count = hierarchy.Count;

            for (int i = 0; count > i; i++)
            {
                HierarchyIndex cur = hierarchy[i];
                cur.Previous = i - 1;
                cur.Next     = i + 1 == count ? -1 : i + 1;
                cur.Parent   = -1;
                cur.Child    = -1;
            }
        }
コード例 #2
0
    public Contorno(int profundidad, int indice, Point[][] contornos, HierarchyIndex[] jerarquias, Contorno padre = null)
    {
        this.profundidad    = profundidad;
        this.indiceOriginal = indice;
        this.padre          = padre;
        contorno            = contornos[indice];
        jerarquia           = jerarquias[indice];
        var indiceHijo = jerarquia.Child;

        while (indiceHijo != -1)
        {
            hijos.Add(new Contorno(profundidad + 1, indiceHijo, contornos, jerarquias, this));
            indiceHijo = jerarquias[indiceHijo].Next;
        }
    }
コード例 #3
0
        public IslaContornos(int indice, Point[][] contornos, HierarchyIndex[] jerarquias)
        {
            this.indice     = indice;
            this.jerarquias = jerarquias;
            this.contornos  = contornos;
            jerarq          = jerarquias[indice];
            contorno        = contornos[indice];

            var indiceHijo = jerarq.Child;

            while (indiceHijo != -1)
            {
                hijos.Add(contornos[indiceHijo]);
                indiceHijo = jerarquias[indiceHijo].Next;
            }
        }
    public void Extraer()
    {
        if (recuadros == null && (recuadros = FindObjectOfType <EncontrarRecuadros>()) == null)
        {
            return;
        }
        if (recuadros.recuadros.Count == 0)
        {
            return;
        }

        ClearTexturas();
        Point[][]        contornos  = recuadros.contornos;
        HierarchyIndex[] jerarquias = recuadros.jerarquiaContornos;

        Recuadro       recuadro  = recuadros.recuadros[indiceRecuadroSel % recuadros.recuadros.Count];
        HierarchyIndex jerarquia = jerarquias[recuadro.indiceContorno];

        Mat matUmbral = recuadros.matUmbralEscalado.Clone();

        Cv2.Dilate(matUmbral, matUmbral, new Mat(), null, 3);
        Cv2.Erode(matUmbral, matUmbral, new Mat(), null, 2);
        Cv2.CvtColor(matUmbral, matUmbral, ColorConversionCodes.GRAY2BGR);
        List <int> hijosDirectos = new List <int>();
        int        hijo          = jerarquia.Child;

        while (hijo != -1)
        {
            if (contornos[hijo].Length > 1)
            {
                hijosDirectos.Add(hijo);
            }
            hijo = jerarquias[hijo].Next;
        }
        Debug.Log(hijosDirectos.Aggregate("", (s, e) => $"{e}({contornos[e].Length})-{s}"));
        foreach (var i in hijosDirectos)
        {
            Cv2.DrawContours(matUmbral, contornos, i, colRojo);
            Cv2.Polylines(matUmbral, new Point[][] { Cv2.ConvexHull(contornos[i]) }, true, colVerde);
        }

        var texturaObjetos = OCVUnity.MatToTexture(matUmbral, GenerarTextura(matUmbral.Width, matUmbral.Height));
    }
コード例 #5
0
ファイル: Sanitizer.cs プロジェクト: SKKbySSK/ProCon28_CS
        public ContoursInfo Process(ContoursInfo Info)
        {
            List <Point[]>        points    = new List <Point[]>();
            List <HierarchyIndex> hierarchy = new List <HierarchyIndex>();

            int length = Info.Length;

            for (int i = 0; length > i; i++)
            {
                Point[]        point = Info.Contours[i];
                HierarchyIndex index = Info.Hierarchy[i];

                int len = point.Length;
                if (len >= UnderLimitation && len <= MaxLimitation)
                {
                    bool use  = true;
                    int  plen = point.Length;
                    for (int pi = 1; plen > pi; pi++)
                    {
                        Point  pb       = point[pi - 1];
                        Point  cur      = point[pi];
                        double distance = Math.Sqrt(Math.Pow(cur.X - pb.X, 2) + Math.Pow(cur.Y - pb.Y, 2));
                        if (distance < MinimumDistance)
                        {
                            use = false;
                            break;
                        }
                    }

                    if (use)
                    {
                        points.Add(point);
                        hierarchy.Add(index);
                    }
                }
            }

            UpdateHierarchy(hierarchy);
            return(new ContoursInfo(points.ToArray(), hierarchy.ToArray()));
        }
コード例 #6
0
        public List <Point2f> GetCorners()
        {
            if (mFrame != null)
            {
                Point[][]        contours  = new Point[][] { };
                HierarchyIndex[] hierarchy = new HierarchyIndex[] { };

                Cv2.FindContours(mFrame, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);

                Point[] rect      = new Point[] { };
                double  maxLength = 0;
                foreach (var item in contours)
                {
                    var perimeter = Cv2.ArcLength(item, true);
                    var approx    = Cv2.ApproxPolyDP(item, 0.015 * perimeter, true);

                    if (approx.Length == 4 && perimeter > maxLength)
                    {
                        maxLength = perimeter;
                        rect      = approx;
                    }
                }

                mResult = new List <Point2f>();
                foreach (var item in rect)
                {
                    mResult.Add(new Point2f(item.X, item.Y));
                }

                OrderPoints();

                return(mResult);
            }

            return(null);
        }
コード例 #7
0
ファイル: frmCut.cs プロジェクト: memoryrobber/VideoAI
        private void button1_Click(object sender, EventArgs e)
        {
            String cFileName = @".\images\IMG01.jpg";
            int    iMinVal   = StringEx.getInt(IMG_MIN.Text);
            int    iMaxVal   = StringEx.getInt(IMG_MAX.Text);

            int iGrayMinVal = StringEx.getInt(GRAY_MIN.Text);
            int iGrayMaxVal = StringEx.getInt(GRAY_MAX.Text);

            int iEXPORT_IMAGE = StringEx.getInt(INIConfig.ReadString("Config", AppConfig.EXPORT_IMAGE, "0"));

            String     cID        = "Export";
            Mat        BgrImage   = null;
            Mat        GrayImage  = null;
            List <Mat> ImageList  = new List <Mat>();
            String     cAbsoDir   = Path.GetDirectoryName(cFileName);
            String     cExportDir = cAbsoDir + @"\" + cID;

            if (!Directory.Exists(cExportDir))
            {
                Directory.CreateDirectory(cExportDir); //不存在文件夹,创建
            }

            BgrImage  = Cv2.ImRead(cFileName, ImreadModes.AnyColor);
            GrayImage = Cv2.ImRead(cFileName, ImreadModes.Grayscale);
            GrayImage.SaveImage("IMG02.jpg");
            //Image<Gray, byte> binaryImage = GrayImage.ThresholdBinary(new Gray(thresholdBinary), new Gray(iVal));
            // ThresholdToZeroInv反取零   ThresholdToZero取零     ThresholdBinary二值    ThresholdBinaryInv反二值  ThresholdTrunc截断
            Mat binaryImage = GrayImage.Threshold(iGrayMinVal, iMaxVal, ThresholdTypes.Binary);

            GrayImage.SaveImage("IMG03.jpg");
            try
            {
                OpenCvSharp.Point[][] rvs        = new OpenCvSharp.Point[1][];
                HierarchyIndex[]      hierarchys = new HierarchyIndex[1];

                Cv2.FindContours(binaryImage, out rvs, out hierarchys, RetrievalModes.CComp, ContourApproximationModes.ApproxNone);

                for (int i = 0; i < rvs.Length; i++)
                {
                    OpenCvSharp.Point[] objItem = rvs[i];
                    Rect vRect = Cv2.BoundingRect(objItem);

                    if ((vRect.Width < iMinVal) || (vRect.Height < iMinVal))
                    {
                        continue;
                    }
                    if ((vRect.Width > iMaxVal) || (vRect.Height > iMaxVal))
                    {
                        continue;
                    }
                    //j++;
                    //Point p1 = new Point(vRect.X, vRect.Y);
                    //Point p2 = new Point(vRect.X + vRect.Width, vRect.Y + vRect.Height);

                    Mat vResult = new Mat(BgrImage, vRect);
                    ImageList.Add(vResult);
                    //String cFileName = DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + i.ToString();
                    //vResult.Save(cExportDir + "\\" + i + ".jpg");
                    //ImageList.Add(cExportDir + "\\" + i + ".jpg");
                    Cv2.Rectangle(BgrImage, vRect, new Scalar(255, 0, 0));
                }
                BgrImage.SaveImage("IMG04.jpg");
                pictureBox1.Image = BitmapConverter.ToBitmap(BgrImage);
            }
            catch (Exception ex)
            {
                log4net.WriteTextLog("报错,原因为:" + ex);
            }
        }
コード例 #8
0
    ///////////////////////////////////////////////////////////////////////////////////////////////
    void openCV_method()
    {
        rectangle.SetActive(true);
        triangularity.SetActive(true);
        sphere.SetActive(true);
        polygon.SetActive(true);

        quadRender.material.mainTexture = processedTexture;

        var src     = new Mat(filePath, ImreadModes.AnyDepth | ImreadModes.AnyColor).Resize(new Size(640, 480));
        var srcCopy = new Mat();

        src.CopyTo(srcCopy);

        var image_gray   = new Mat();
        var image_canny  = new Mat();
        var image_circle = new Mat();

        Cv2.CvtColor(srcCopy, image_gray, ColorConversionCodes.BGRA2GRAY);
        image_gray.CopyTo(image_circle);
        Cv2.Canny(image_gray, image_gray, 150, 250, 3);

        Cv2.Blur(image_gray, image_canny, new Size(3, 3));

        var kenel = new Mat();

        kenel = Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(11, 11));
        var morph = new Mat();

        Cv2.MorphologyEx(image_gray, morph, MorphTypes.Close, kenel);

        Point[][]        contours  = new Point[100][];
        HierarchyIndex[] hierarchy = new HierarchyIndex[100];

        Cv2.FindContours(morph, out contours, out hierarchy, RetrievalModes.CComp,
                         ContourApproximationModes.ApproxSimple, new Point(0, 0));

        int idx;
        Mat contours_img = new Mat();

        Cv2.CvtColor(image_gray, contours_img, ColorConversionCodes.GRAY2BGR);
        for (idx = 0; idx < contours.Length; idx++)
        {
            Cv2.DrawContours(contours_img, contours, idx, Scalar.Red, 2);
        }


        Mat poly_img      = new Mat();
        Mat ractangle_img = new Mat();

        Cv2.CvtColor(image_gray, poly_img, ColorConversionCodes.GRAY2BGR);
        Cv2.CvtColor(image_gray, ractangle_img, ColorConversionCodes.GRAY2BGR);

        find_circle(image_circle, 50.0f);
        find_polygon(3, 50.0f, contours, image_circle);
        find_polygon(4, 50.0f, contours, image_circle);
        find_polygon(10000, 50.0f, contours, image_circle);

        foreach (Polygon_T s in polygon_array)
        {
            DrawGraphic(s);
        }


        rectangle.SetActive(false);
        triangularity.SetActive(false);
        sphere.SetActive(false);
        polygon.SetActive(false);
        filePath = string.Empty;
    }