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); }
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; }
public bool Comparar(Contorno contorno, float umbralDiferenciaArea = 0.9f) { return(Comparar(contorno.contorno, umbralDiferenciaArea)); }