public Texture2D ExtraerSprite(Mat matOriginal, Contorno contorno, int ajustarRotacion)
    {
        var matTexturaAlfa = new Mat(contorno.BoundingRect.Height, contorno.BoundingRect.Width, MatType.CV_8UC1, new Scalar());

        Cv2.DrawContours(matTexturaAlfa, new[] { contorno.contorno }, 0, ProcesarRecuadros.ColEscalarBlanco,
                         -1, LineTypes.AntiAlias, null, 0, -contorno.BoundingRect.TopLeft);

        var matTexturaColor = new Mat(matOriginal, contorno.BoundingRect);

        if (equalizarHistograma || ajusteTresh > 0f || equalizarHistogramaDeSat)
        {
            var convertMat = new Mat();
            Cv2.CvtColor(matTexturaColor, convertMat, ColorConversionCodes.BGR2HSV);
            var splits = convertMat.Split();

            if (equalizarHistograma || equalizarHistogramaDeSat)
            {
                var clahe = Cv2.CreateCLAHE();
                if (equalizarHistograma)
                {
                    Cv2.FastNlMeansDenoising(splits[2], splits[2]);
                    clahe.Apply(splits[2], splits[2]);
                }
                if (equalizarHistogramaDeSat)
                {
                    Cv2.FastNlMeansDenoising(splits[1], splits[1]);
                    clahe.Apply(splits[1], splits[1]);
                }
            }
            // Cv2.Threshold(splits[2],splits[1],ajusteTresh,255,ThresholdTypes.TozeroInv);
            if (ajusteTresh > 0)
            {
                Cv2.Threshold(splits[1], splits[1], ajusteTresh, 255, ThresholdTypes.Tozero);
            }

            // clahe.Apply(splits[1],splits[1]);
            // clahe.Apply(splits[2],splits[2]);
            // Cv2. EqualizeHist(splits[2],splits[2]);
            Cv2.Merge(splits, matTexturaColor = convertMat);
            Cv2.CvtColor(matTexturaColor, matTexturaColor, ColorConversionCodes.HSV2BGR);
        }

        var textura = new Texture2D(matTexturaAlfa.Width, matTexturaAlfa.Height);

        textura.alphaIsTransparency = true;
        textura.hideFlags           = HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor;

        Cv2.Merge(matTexturaColor.Split().Concat(new[] { matTexturaAlfa }).ToArray(), matTexturaAlfa);

        if (ajustarRotacion > 0)
        {
            Cv2.Rotate(matTexturaAlfa, matTexturaAlfa, (RotateFlags)(ajustarRotacion - 1));
        }
        textura = OCVUnity.MatToTexture(matTexturaAlfa, textura);

        return(textura);
    }
Exemplo n.º 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;
        }
    }
    public void Extraer(Mat matOriginal, Recuadro recuadro)
    {
        if (recuadro.matRecuadroNormalizado == null)
        {
            recuadro.Normalizar(matOriginal, 0);
        }
        var matRecuadro  = recuadro.matRecuadroNormalizado.Clone();
        var escalaSalida = maxTamLadoImagenProcesada / Mathd.Max((double)matRecuadro.Width, (double)matRecuadro.Height);

        if (escalaSalida < 1)
        {
            Cv2.Resize(matRecuadro, matRecuadro, new Size(), escalaSalida, escalaSalida);
        }
        else if (escalaSalida > 1)
        {
            escalaSalida = 1;
        }
        if (conservarOriginal)
        {
            matRecuadro = matRecuadro.Clone();
        }
        Cv2.CvtColor(matRecuadro, matRecuadro, ColorConversionCodes.BGR2GRAY);
        matRecuadro = filtroAdaptativo.Procesar(matRecuadro);

        if (repeatDilate > 0)
        {
            var kernelDilate = Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(tamKernelDilate, tamKernelDilate));
            Cv2.Dilate(matRecuadro, matRecuadro, kernelDilate, null, repeatDilate);
        }
        if (tamMedianBlur > 1)
        {
            Cv2.MedianBlur(matRecuadro, matRecuadro, tamMedianBlur);
        }

        var contornosSinProcesar = filtroContornos.Procesar(matRecuadro);

        texturasResultantes.Clear();
        spriteResultantes.Clear();
        contornos = new List <Contorno>();

        var tamRecuadro = recuadro.matRecuadroNormalizado.Size();
        var tamMinimo   = tamMinimoSprite * Mathf.Min(tamRecuadro.Width, tamRecuadro.Height);

        for (int i = 0; i < contornosSinProcesar.Length; i++)
        {
            var contniu = new Contorno(i, contornosSinProcesar);
            contniu.Escalar(1d / escalaSalida);
            var bbox = contniu.BoundingRect;
            if (bbox.Width >= tamMinimo && bbox.Height >= tamMinimo &&
                bbox.Left > 0 && bbox.Right < tamRecuadro.Width - 1 && bbox.Top > 0 && bbox.Bottom < tamRecuadro.Height - 1)
            {
                var textExtraida = ExtraerSprite(recuadro.matRecuadroNormalizado, contniu, ajustarRotacion);
                texturasResultantes.Add(textExtraida);
                contornos.Add(contniu);
                var spriteGen = Sprite.Create(textExtraida, new UnityEngine.Rect(0, 0, textExtraida.width, textExtraida.height)
                                              , Vector2.one / 2f, 100f, 1, SpriteMeshType.Tight, Vector4.zero, false);
                spriteResultantes.Add(spriteGen);
            }
        }

        this.matRecuadro = matRecuadro;
    }
Exemplo n.º 4
0
 public bool Comparar(Contorno contorno, float umbralDiferenciaArea = 0.9f)
 {
     return(Comparar(contorno.contorno, umbralDiferenciaArea));
 }