private void OnDestroy()
 {
     recuadroExaminado = null;
     foreach (var obj in destruime)
     {
         if (obj && !AssetDatabase.Contains(obj))
         {
             DestroyImmediate(obj);
         }
     }
 }
 void OnEnable()
 {
     if (texturaSubida)
     {
         recuadroExaminado = null;
         if (procRecuadros && procRecuadros.Recuadros != null)
         {
             Procesar();
         }
     }
 }
    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));
    }
    void Procesar()
    {
        recuadroExaminado = null;
        var matProcesado = procRecuadros.ProcesarTextura(texturaSubida, true);
        var escala       = matProcesado.Width / (double)matProcesado.Width;

        if (matProcesado.Channels() == 1)
        {
            Cv2.CvtColor(matProcesado, matProcesado, ColorConversionCodes.GRAY2BGR);
        }

        var arbol = procRecuadros.mapaDeContornos.contornosExteriores;

        Cv2.DrawContours(matProcesado, arbol.Select(c => c.contorno.Select(p => p * escala)), -1, ProcesarRecuadros.ColEscalarAzul);
        foreach (var rec in procRecuadros.Recuadros)
        {
            // rec.DibujarDebug(matProcesado, ProcesarRecuadros.ColEscalarRojo, escala);
            // var rect = Cv2.MinAreaRect(rec.contornoOriginal);
            Cv2.Polylines(matProcesado, new[] { rec.quadReducido }, true, ProcesarRecuadros.ColEscalarRojo, 1);
        }
        textPrimerPasada = ActualizarPreview(textPrimerPasada, matProcesado);
        ActualizarExtractoresSprites();
    }
    void ExtraerSpritesDeRecuadro(Recuadro rec)
    {
        var extractor = ExtractorDe(rec);

        extractor.Extraer(procRecuadros.MatOriginal, rec);
    }
    bool ExtractorExisteDe(Recuadro rec)
    {
        var index = procRecuadros.Recuadros.IndexOf(rec);

        return(index != -1 && extractoresSprites[index] != null);
    }
    ExtraerSprites ExtractorDe(Recuadro rec)
    {
        var index = procRecuadros.Recuadros.IndexOf(rec);

        return(extractoresSprites[index]);
    }
    void OnGUI()
    {
        if (texturaSubida)
        {
            var curEvent     = Event.current;
            var dobleColumna = recuadroExaminado != null && position.width > 600;
            var anchoColumna = dobleColumna ? position.width / 2f:0;
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.BeginVertical(GUILayout.MaxWidth(anchoColumna));

            var aspectTextura = texturaSubida.width / (float)texturaSubida.height;
            // var maxWidth = position/2f;


            EditorGUILayout.BeginHorizontal();
            // var areaPreview = GUILayoutUtility.GetRect(0, position.width, 0, alturaPreview);

            // var rect = new UnityEngine.Rect(areaPreview.x, areaPreview.y, areaPreview.height * aspectTextura, areaPreview.height);//GUILayoutUtility.GetAspectRect(aspectTextura);
            var rect = GUILayoutUtility.GetAspectRect(aspectTextura, GUILayout.MaxWidth(aspectTextura * alturaPreview));

            // rect.width /= 2f;
            EditorGUI.DrawTextureTransparent(rect, texturaSubida);
            EditorGUI.DropShadowLabel(rect, $"({texturaSubida.width}x{texturaSubida.height})");
            if (procRecuadros && procRecuadros.Recuadros != null)
            {
                var escala = new Vector2(rect.width / textPrimerPasada.width, rect.height / textPrimerPasada.height);
                foreach (var rec in procRecuadros.Recuadros)
                {
                    var cvbbox = OpenCvSharp.Rect.BoundingBoxForPoints(rec.quadReducido.Select(p => new Point(p.X * escala.x, p.Y * escala.y)).ToArray());
                    var bbox   = new UnityEngine.Rect(cvbbox.X + rect.x, cvbbox.Y, cvbbox.Width, cvbbox.Height);
                    // EditorGUI.DrawRect(bbox, Color.green);
                    if (recuadroExaminado == rec)
                    {
                        GUI.color = Color.green;
                    }
                    EditorGUI.DropShadowLabel(bbox, $"#{procRecuadros.Recuadros.IndexOf(rec)}");
                    GUI.color = Color.white;

                    if (curEvent.type == EventType.MouseUp && bbox.Contains(curEvent.mousePosition))
                    {
                        recuadroExaminado = rec == recuadroExaminado ? null : rec;
                        // if (recuadroExaminado != null) textRecuadro = ActualizarPreview(textRecuadro, rec.matRecuadroNormalizado);
                        if (recuadroExaminado != null)
                        {
                            textRecuadro = ActualizarPreview(textRecuadro, ExtractorDe(rec).matRecuadro);
                        }
                    }
                }
            }
            // rect.x += rect.width;
            if (textRecuadro && recuadroExaminado != null)
            {
                aspectTextura = textRecuadro.width / (float)textRecuadro.height;
                rect          = GUILayoutUtility.GetAspectRect(aspectTextura, GUILayout.MaxWidth(aspectTextura * alturaPreview));
                // rect.width = rect.height * textRecuadro.width / textRecuadro.height;
                EditorGUI.DrawTextureTransparent(rect, textRecuadro);
                EditorGUI.DropShadowLabel(rect, $"({textRecuadro.width}x{textRecuadro.height})");
            }
            else if (textPrimerPasada)
            {
                rect = GUILayoutUtility.GetAspectRect(aspectTextura, GUILayout.MaxWidth(aspectTextura * alturaPreview));
                EditorGUI.DrawTextureTransparent(rect, textPrimerPasada);
            }

            EditorGUILayout.EndHorizontal();

            if (!procRecuadros)
            {
                destruime.Add(procRecuadros = ScriptableObject.CreateInstance <ProcesarRecuadros>());
                Procesar();
                Editor.CreateCachedEditor(procRecuadros, typeof(CustomProcRecuadrosEditor), ref procRecuadrosEditor);
            }

            if (extractoresSprites != null && recuadroExaminado != null)
            {
                DibujarControlSprites();
                SpritesEncontrados(dobleColumna);
            }
            else
            {
                DibujarControlRecuadros();
            }

            EditorGUILayout.EndVertical();
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            EditorGUI.BeginDisabledGroup(string.IsNullOrEmpty(pathOrigen));
            if (GUILayout.Button("Save"))
            {
                Save(pathOrigen);
            }
            EditorGUI.EndDisabledGroup();
            if (GUILayout.Button("Save As.."))
            {
                var path = EditorUtility.SaveFilePanelInProject("Guardar Extractor De Sprites", "auto_sprites", "asset", "Puedes volver a cambiar parametros y volver a procesar los sprites");
                if (!string.IsNullOrEmpty(path))
                {
                    Save(pathOrigen = path);
                }
            }
            EditorGUILayout.EndHorizontal();
        }
    }
    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;
    }
 private void InitializeBoard()
 {
     _recuadros = new Recuadro[3,3];
     for (int i = 0; i < 3; i++)
     {
         for (int j = 0; j < 3; j++)
         {
             _recuadros[i, j] = new Recuadro(i, j, VisualElement);
             _recuadros[i, j].Tap += new EventHandler<DataEventArgs<Position>>(Board_Tap);
         }
     }
     RemainingBlocks = 9;
     FinishedGame = false;
 }