private unsafe List <ZdjecieZPozycją> ZnajdźNoweObszary(bool *c, SiecNeuronowa.ISiećNeuronowa <string> sieć, Size Wielkość) { List <ZdjecieZPozycją> z = new List <ZdjecieZPozycją>(); foreach (var item in ZnalezioneObszary) { if (item.Count > 0) { List <ZdjecieZPozycją> Lisr = new List <ZdjecieZPozycją>(); foreach (var item2 in item) { ZdjecieZPozycją zpi; if (ObsógaMapyObszarów.TryGetValue(item2.NarKwadratu, out zpi)) { Lisr.Add(zpi); } } if (Lisr.Count > 0) { ZdjecieZPozycją zp = new ZdjecieZPozycją(); zp.Obszar = DoKwadratów.StwórzKwadratZawierającyWiele(Lisr.ToArray()); zp.ObliczPodobieństwo(c, Wielkość.Width, sieć); zp.Moc = Lisr.Sum(x => x.Moc); z.Add(zp); } } } return(z); }
private unsafe void SpróbojRozdzielić(ZdjecieZPozycją item, bool *mapa, int szerokość, List <ZdjecieZPozycją> dododania, HashSet <ZdjecieZPozycją> doUsuniecia, bool DziałanieKrytyczne) { SpróbujWypalić(item, mapa, szerokość); if (item.Obszar.Width < 1 || item.Obszar.Height < 1 || item.Obszar.Height > 5000) { return; } int[] ŻutAksonomiczny = ZlepianieLiterRzutami.PobierzRzutX(mapa, item.Obszar, szerokość); int Miejsce = 0; double Min = int.MaxValue; int SzerokośćObiektu = item.Obszar.Width; for (int i = 0; i < SzerokośćObiektu; i++) { double x = ŻutAksonomiczny[i]; double Zm = i + 0.5f; Zm /= SzerokośćObiektu; double K = (1 - Zm) * Zm; Zm = K * K; x /= Zm; if (Min > x) { Min = x; Miejsce = i; } } ZdjecieZPozycją a = new ZdjecieZPozycją(); a.Obszar = new Rectangle(item.Obszar.X, item.Obszar.Y, Miejsce - ZminiejszenieWielkości, item.Obszar.Height); //a.ObrazWBool = (bool*)(GrafyShp.Icer.OperacjeNaStrumieniu.KopiujFragment(mapa, new Size(szerokość, 0), a.Obszar)); a.ObliczPodobieństwo(mapa, szerokość, sieć); ZdjecieZPozycją b = new ZdjecieZPozycją(); b.Obszar = new Rectangle(item.Obszar.X + Miejsce + ZminiejszenieWielkości, item.Obszar.Y, item.Obszar.Width - Miejsce - ZminiejszenieWielkości, item.Obszar.Height); b.ObliczPodobieństwo(mapa, szerokość, sieć); item.ObliczPodobieństwo(mapa, szerokość, sieć); int IlorazRozmiarów = a.Obszar.Size.WielkoścWPix() * b.Obszar.Size.WielkoścWPix(); float Współczynik = ((a.NajbliszePodobieństwo + b.NajbliszePodobieństwo) / 2) / (item.NajbliszePodobieństwo + 0.000001f); if (DziałanieKrytyczne) { Współczynik *= Matematyka.Podobność(item.Obszar.Width, Próg);//podobność zawsze(0,1) } if ((Współczynik < 1 && IlorazRozmiarów > (ZminiejszenieWielkości * ZminiejszenieWielkości))) { dododania.Add(a); dododania.Add(b); doUsuniecia.Add(item); } }
public ZdjecieZPozycją PobierzZdjecie(List <int> Zloczone) { ListaZPorównywaniem <int> l = new ListaZPorównywaniem <int>(Zloczone); if (DzienikZnalezionych.ContainsKey(l)) { return(DzienikZnalezionych[l]); } else { ZdjecieZPozycją z = new ZdjecieZPozycją(); z.Obszar = DoKwadratów.StwórzKwadratZawierającyWiele(PobierzZdjeciaPoIndeksach(Zloczone)); z.Skeljona = Zloczone.Count > 1; z.ObliczPodobieństwo(Obraz, Szerokośc, Sieć); DzienikZnalezionych.Add(l, z); return(z); } }
private static void ObszaryNaZdzieciaZPozycją(ref bool *c, Size SamLoto, bool *ObrazKopis, List <ZdjecieZPozycją> ListaZdjęć, out ZdjecieZPozycją Logo, bool UżywajZlepianiaRzutem) { Logo = null; int * MapaSpójnychObszarów; float NajbardzjeLogowaty = 0; List <WstepnePrzygotowanie.ObiektNaMapie> Obszary = WstepnePrzygotowanie.ZnajdźOpszary(ref c, SamLoto.Width, SamLoto.Height, out MapaSpójnychObszarów); foreach (var item in Obszary) { Rectangle rl = new Rectangle(item.MinX, item.MinY, item.MaxX - item.MinX + 1, item.MaxY - item.MinY + 1); ZdjecieZPozycją z = new ZdjecieZPozycją(); z.Obszar = rl; z.Moc = item.Moc; z.ObiektNaMapie = item; z.ObliczPodobieństwo(c, SamLoto.Width, Sieć); //usóń w dalszej fazie i Usń też Kopie z.ObrazWBool = WstepnePrzygotowanie.PobierzObszar(ObrazKopis, z, SamLoto.Width, SamLoto.Height); if (SprawdźPoprawne(item)) { ListaZdjęć.Add(z); } float Logowatość = ObliczLogowatość(z); if (Logowatość > NajbardzjeLogowaty) { NajbardzjeLogowaty = Logowatość; Logo = z; } } WczytajParametry(Logo); if (UżywajZlepianiaRzutem) { ZlepianieLiterRzutami zlk = new ZlepianieLiterRzutami(ŚredniaSzerokość, ŚredniaWysokość); zlk.Zlepiaj(MapaSpójnychObszarów, Sieć, SamLoto, c, ListaZdjęć); } Marshal.FreeHGlobal((IntPtr)MapaSpójnychObszarów); }
public void Scal() { List <ZdjecieZPozycją> DoDodania = new List <ZdjecieZPozycją>(); HashSet <ZdjecieZPozycją> DoUsuniecia = new HashSet <ZdjecieZPozycją>(); while (w.Count != 0) { WystepująceWTymSamymMiejscu ostatni = w.Last(); if (ostatni.Count == 1) { w.RemoveAt(w.Count - 1); continue; } ZdjecieZPozycją z = new ZdjecieZPozycją(); z.Obszar = DoKwadratów.StwórzKwadratZawierającyWiele(ostatni.ToArray()); z.ObszarInterpolowany = DoKwadratów.StwórzKwadratZawierającyWieleRec(WeźInterpolowany(ostatni)); z.Skeljona = true; z.ObliczPodobieństwo(Obraz, Szerokość, sieć); if (PrógDoUsuniecia + z.NajbliszePodobieństwo < ostatni.Podobność) { foreach (var item in ostatni) { DoUsuniecia.Add(item); } w.RemoveAll(X => X.Kolizja(ostatni)); DoDodania.Add(z); } else { w.RemoveAt(w.Count - 1); } } LinikaZmieniana.ListaZZdjeciami.RemoveAll(X => DoUsuniecia.Contains(X)); LinikaZmieniana.ListaZZdjeciami.AddRange(DoDodania); LinikaZmieniana.ListaZZdjeciami.Sort(new DoKwadratów.SortowanieWzgledemX()); }