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; }