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); }
public bool Sąsiedztwo(ZdjecieZPozycją zp) { int X = Matematyka.Styczność2Obiektów(Obszar.X, Obszar.X + Obszar.Width, zp.Obszar.X, zp.Obszar.X + zp.Obszar.Width); int Y = Matematyka.Styczność2Obiektów(Obszar.Y, Obszar.Y + Obszar.Height, zp.Obszar.Y, zp.Obszar.Y + zp.Obszar.Height); return(X > NajbliszaOdległośćSąsiada && Y > NajbliszaOdległośćSąsiada); }
public override unsafe void Znajdź(ZdjecieZPozycją Logo, Linika[] lab2, bool *Binaryn, int DługośćWiersza) { LinikaWzgledna[] LinikiWzgledne = LinikaWzgledna.PobierzLinikiWzgledne(lab2); base.ZnajdźDateLosowania(Logo, LinikiWzgledne, Binaryn); float NajlepszyWynik = 0; string[] NajlepszyString = null; foreach (var item in LinikiWzgledne) { if (item.Y > Logo.Obszar.Bottom + Logo.Obszar.Height * 0.6 && (item.Y < base.MiejsceDaty())) { float Podobieństwo = WynikLotoWzór.PodobieństwoIteracyjne(item, 80, (int)ProstokątNaObrazie.IlośćPikseliSQRT); if (Podobieństwo > MinimalnePodobieństwoWyniku) { item.DopasujProporcje(Binaryn, DługośćWiersza); Numery.Add(item.NajlepszeDopasowanieDoLiniki.UstalOdpowiednie(item, StałeGlobalne.DopuszalneOdalenieOdWzorca, RozpoznawanieKuponu.DzienikZamian, WspółczynikUsunieci)); } if (Podobieństwo > NajlepszyWynik) { NajlepszyWynik = Podobieństwo; item.DopasujProporcje(Binaryn, DługośćWiersza); NajlepszyString = item.NajlepszeDopasowanieDoLiniki.UstalOdpowiednie(item, StałeGlobalne.DopuszalneOdalenieOdWzorca, RozpoznawanieKuponu.DzienikZamian, WspółczynikUsunieci); } } } if (Numery.Count == 0) { Numery.Add(NajlepszyString); } }
public static float[,] TablicaWartości(ZdjecieZPozycją z, bool *Obraz, Size RozmarWejścia, Size RozmarWyjścia) { int y = z.Obszar.Height, x = z.Obszar.Width; int Wy = RozmarWyjścia.Height, Wx = RozmarWyjścia.Width; float[,] zw = new float[y, x]; float[,] Dzielniki = new float[y, x]; float fy = (Wy - StałaDoConvert) / (y - 1), fx = ((Wx - StałaDoConvert)) / (x - 1); bool *Początek = Obraz + RozmarWejścia.Width * z.Obszar.Y + z.Obszar.X; bool *MiejscePrzeglądane = Początek; for (int i = 0; i < y; i++) { for (int j = 0; j < x; j++, MiejscePrzeglądane++) { int MiejsceX = (int)(fx * j); int MiejsceY = (int)(fy * i); Dzielniki[MiejsceY, MiejsceX]++; if (*MiejscePrzeglądane) { zw[MiejsceY, MiejsceX]++; } } } for (int i = 0; i < Wy; i++) { for (int j = 0; j < Wx; j++) { zw[i, j] /= Dzielniki[i, j]; } } return(zw); }
private static void WczytajParametry(ZdjecieZPozycją logo) { if (logo != null) { ZbytSzeroki = Convert.ToInt32(logo.Obszar.Width * ProcentLotkaDoRozdzielaniaZLoga); ŚredniaSzerokość = Convert.ToInt32(logo.Obszar.Width * SzerokośćOdLoga); ŚredniaWysokość = Convert.ToInt32(logo.Obszar.Height * WysokośćOdLoga); } }
private static void Zapisz(int Zap, FolderBrowserDialog fsb, Bitmap b, ZdjecieZPozycją item) { if (item.Obszar.X > 0 && item.Obszar.Y > 0 && item.Obszar.X + item.Obszar.Width < b.Width && item.Obszar.Height + item.Obszar.Y < b.Height) { Bitmap az = b.Clone(item.Obszar, PixelFormat.Format24bppRgb); az.Save(fsb.SelectedPath + "\\" + Zap.ToString() + " " + Wyświetl(item.Tag) + ".bmp"); az.Dispose(); } }
private void textBox1_TextChanged(object sender, EventArgs e) { if (listBox1.SelectedIndex >= 0) { TextBox tx = (TextBox)sender; ZdjecieZPozycją zp = Zaznaczony[listBox1.SelectedIndex]; zp.Text = tx.Text; } }
public static unsafe bool *PobierzObszar(bool *początek, ZdjecieZPozycją ZZP, int x, int y) { int Ilość = 0; Point Miejsce = ZZP.ObiektNaMapie.Miejsce;; Size Rozmar = ZZP.ObiektNaMapie.Rozmar; bool *Zwracana = (bool *)Marshal.AllocHGlobal(Rozmar.Width * Rozmar.Height); GrafyShp.Icer.OperacjeNaStrumieniu.Czyść((bool *)Zwracana, Rozmar.Width * Rozmar.Height); początek[Miejsce.X + Miejsce.Y * x] = false; Stack <Point> Miejsca = new Stack <Point>(); Miejsca.Push(Miejsce); int xn = x - 1, yn = y - 1; int MinX = ZZP.ObiektNaMapie.MinX; int MinY = ZZP.ObiektNaMapie.MinY; while (Miejsca.Count > 0) { Ilość++; Point poz = Miejsca.Pop(); bool *ml = początek + x * poz.Y + poz.X; Zwracana[Rozmar.Width * (poz.Y - MinY) + (poz.X - MinX)] = true; if (poz.X > 0 && ml[-1]) { ml[-1] = false; Miejsca.Push(new Point() { X = poz.X - 1, Y = poz.Y }); } if (poz.X < xn && ml[1]) { ml[1] = false; Miejsca.Push(new Point() { X = poz.X + 1, Y = poz.Y }); } if (poz.Y < yn && ml[x]) { ml[x] = false; Miejsca.Push(new Point() { X = poz.X, Y = poz.Y + 1 }); } if (poz.Y > 0 && ml[-x]) { ml[-x] = false; Miejsca.Push(new Point() { X = poz.X, Y = poz.Y - 1 }); } } return(Zwracana); }
public static Linika[] PodzielNaLiniki(ref bool *c, ref Size SamLoto, out ZdjecieZPozycją Logo, bool UżywanieZlepianiaRzutem = false, bool UżywanieRozdzielaniaLiter = true) { Logo = null; int Długość = SamLoto.Width * SamLoto.Height; bool *ObrazKopis = (bool *)Marshal.AllocHGlobal(Długość); OperacjeNaStrumieniu.Kopiuj(ObrazKopis, c, Długość); GC.Collect(); List <ZdjecieZPozycją> ListaZdjęć = new List <ZdjecieZPozycją>(); ObszaryNaZdzieciaZPozycją(ref c, SamLoto, ObrazKopis, ListaZdjęć, out Logo, UżywanieZlepianiaRzutem); Marshal.FreeHGlobal((IntPtr)ObrazKopis); Linika[] z = null; if (UstalKieróne(ref z, ref c, ref SamLoto, ref Logo)) { return(z); } if (UżywanieRozdzielaniaLiter) { RozdzielanieLiter rk = new RozdzielanieLiter(ZbytSzeroki, Sieć); rk.Rodzielaj(ListaZdjęć, c, SamLoto, UżywanieZlepianiaRzutem); } int PrógMimalnejOdległośc = Convert.ToInt32(MaksymalneOdalenie * SamLoto.Width); //w tym momencie lotek powinien być w odpowiedniej pozycji List <Linika> ZwracanePrzedPrzemianą = PrzydzielanieDoLinik(ListaZdjęć, PrógMimalnejOdległośc); ScalajLiniki(ZwracanePrzedPrzemianą); ZlepianieLinijek zl = null; zl = new ZlepianieLinijek(Sieć); zl.ZlepPeknieteLitery(ZwracanePrzedPrzemianą, c, SamLoto.Width); ListaZdjęć = Rozczep(ZwracanePrzedPrzemianą); UsuńNaPoczątku(SamLoto.Width, ListaZdjęć); //PrzypiszPrzesóniecia(ZwracanePrzedPrzemianą); //Przesón(ZwracanePrzedPrzemianą); ZwracanePrzedPrzemianą = PrzydzielanieDoLinik(ListaZdjęć, PrógMimalnejOdległośc); Przesón(ZwracanePrzedPrzemianą); ZwracanePrzedPrzemianą = PrzydzielanieDoLinik(ListaZdjęć, PrógMimalnejOdległośc, true); UsuńSzumy(ZwracanePrzedPrzemianą); ScalajLiniki(ZwracanePrzedPrzemianą, true); PosortujY(ZwracanePrzedPrzemianą); ZlepianieLiterMetodąY(ZwracanePrzedPrzemianą, SamLoto.Width, c, Sieć); ObliczPodobieństwoStworzonychZNeuronową(Sieć, SiećNeuronowa, SamLoto.Width, ZwracanePrzedPrzemianą, c); return(ZwracanePrzedPrzemianą.ToArray()); //return StaryPodziałNaLiniki(SamLoto, ListaZdjęć, sklaerY, TBY); }
public string[] UstalOdpowiednie(ObszarWzgledny[] ZNalezione, Dictionary <string, int> TabelaZamian) { int Index = 0; string[] zw = new string[ZNalezione.Length]; foreach (ObszarWzgledny item in CześciLinijek) { ObszarWzgledny ObszarPrzeglądany = ZNalezione[Index]; if (ObszarPrzeglądany == null) { Index++; continue; } if (item.SprawdźSybol(ObszarPrzeglądany.Pierwszy())) { zw[Index] = ObszarPrzeglądany.Pierwszy(); } else { float NajlepszeDopasowanie = float.MaxValue; string s = ""; ZdjecieZPozycją Zp = ObszarPrzeglądany.Obszar; if (Zp.TablicaOdległościOdWzorców != null) { foreach (var i in item.Litery) { string item2 = i; if (item2 == null || item2 == "błąd") { continue; } if (item2 == "0") { item2 = "O"; } float Wartość = Zp.TablicaOdległościOdWzorców[TabelaZamian[item2]]; if (Wartość < NajlepszeDopasowanie) { NajlepszeDopasowanie = Wartość; s = item2; } } if (NajlepszeDopasowanie < DopuszczalnyBłądOdejsciaOdLitery) { zw[Index] = s; } } } Index++; } return(zw); }
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 void Add(ZdjecieZPozycją zp) { int MaxTmp = zp.Obszar.Y + zp.Obszar.Height; if (zp.Obszar.Y < Min) { Min = zp.Obszar.Y; } if (MaxTmp > Max) { Max = MaxTmp; } ListaZZdjeciami.Add(zp); }
private unsafe void WyświetlObraz(bool *binarny, Bitmap SamLoto, ZdjecieZPozycją Logo, object o) { Bitmap bp = WstepnePrzygotowanie.WskaźnikNaObraz(binarny, SamLoto.Width, SamLoto.Height).Clone(Logo.Obszar, PixelFormat.Format24bppRgb); FormatkaObrazka ob = new FormatkaObrazka(); ob.Obraz = bp; if (o is bool) { ZdjecieLoga = bp; } else { } }
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (listBox1.SelectedIndex >= 0) { ZdjecieZPozycją zp = Zaznaczony[listBox1.SelectedIndex]; Bitmap obraztmp = zd.Clone(zp.Obszar, PixelFormat.Format24bppRgb); pictureBox1.Image = new Bitmap(obraztmp, new Size(pictureBox1.Width, pictureBox1.Height)); label1.Text = $"ilość sąsiadów to {zp.IlośćSąsiadów}"; label2.Text = "sklejona" + zp.Skeljona.ToString(); label4.Text = "Najblisze Podobieństwo " + zp.NajbliszePodobieństwo; label3.Text = "wypełnienie " + zp.Wypełninienie(); label5.Text = "zlepione Rzutami" + zp.ZlepionaRzutami; textBox1.Text = Zaznaczony[listBox1.SelectedIndex].Text; } }
private void SprawdźLinike(Linika Linika, int szerkość) { List <ZdjecieZPozycją> MniejszaLista = Linika.ListaZZdjeciami; for (int i = 0; i < MniejszaLista.Count; i++) { for (int j = i + 1; j < MniejszaLista.Count; j++) { ZdjecieZPozycją ZMniejsze = MniejszaLista[i], ZWiekszej = MniejszaLista[j]; if (ZMniejsze.Sąsiedztwo(ZWiekszej)) { Graf.PołączenieDwustrone(Obiekty[ZMniejsze].Pomocniczy, Obiekty[ZWiekszej].Pomocniczy); } } } }
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 float ObliczLogowatość(ZdjecieZPozycją z) { float X = z.Obszar.Width, Y = z.Obszar.Height; float zw = X * Y; float Min, Max; if (X < Y) { Min = X; Max = Y; } else { Min = Y; Max = X; } zw *= Min / Max; zw *= Matematyka.Podobność(WypełnienieLoga, z.Wypełninienie()) * Matematyka.Podobność(z.Obszar.Size.WielkoścWPix(), SkalerLoga); return(zw); }
private static List <Linika> PrzydzielanieDoLinik(List <ZdjecieZPozycją> ListaZdjęć, int PrógMimalnejOdległośc, bool PodobieństwoInterpolowane = false) { ListaZdjęć.Sort(new DoKwadratów.SortowanieWzgledemX()); List <Linika> ZwracanePrzedPrzemianą = new List <Linika>(); foreach (var item in ListaZdjęć) { int Index = -1; float NajbardziejPodobny = float.MinValue; for (int i = 0; i < ZwracanePrzedPrzemianą.Count; i++) { ZdjecieZPozycją Ostanij = ZwracanePrzedPrzemianą[i].Last(); float Podobieństwo = 0; if (PodobieństwoInterpolowane) { Podobieństwo = Matematyka.PodobieństwoYProstokontów(Ostanij.ObszarInterpolowany, item.ObszarInterpolowany); } else { Podobieństwo = Matematyka.PodobieństwoYProstokontów(Ostanij.Obszar, item.Obszar); } if (Podobieństwo > NajbardziejPodobny && item.Obszar.X - Ostanij.Obszar.X < PrógMimalnejOdległośc) { Index = i; NajbardziejPodobny = Podobieństwo; } } if (NajbardziejPodobny > MinimalnePodobieństwo) { ZwracanePrzedPrzemianą[Index].Add(item); } else { ZwracanePrzedPrzemianą.Add(new Linika()); ZwracanePrzedPrzemianą.Last().Add(item); } } return(ZwracanePrzedPrzemianą); }
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()); }
private unsafe void SpróbujWypalić(ZdjecieZPozycją item, bool *mapa, int szerokość) { if (item.Wypełninienie() > PrógWypalania) { for (int i = 0; i < IlośćWypaleńPoPrzekroczeniuProgu; i++) { item.Moc -= Wypełnienie(szerokość, item.Obszar, mapa); } item.Obszar.X += 2; item.Obszar.Y += 2; item.Obszar.Width -= 4; item.Obszar.Height -= 4; int I = 0; while (item.Wypełninienie() > PrógWypalania && I++ < IlośćMaksWYpaleń) { item.Moc -= Wypełnienie(szerokość, item.Obszar, mapa); item.Obszar.X += 1; item.Obszar.Y += 1; item.Obszar.Width -= 2; item.Obszar.Height -= 2; } item.Obszar = ZnajdźZmienszenia(item.Obszar, szerokość, mapa); } }
public override unsafe void Znajdź(ZdjecieZPozycją Logo, Linika[] lab2, bool *Binaryn, int DługośćWiersza) { }
public static float[,] TablicaWartości(ZdjecieZPozycją z, int SzerokośćWejścia, bool *Obraz, Size RozmarWyjścia) { return(TablicaWartości(z.Obszar, SzerokośćWejścia, Obraz, RozmarWyjścia)); }
private static bool UstalKieróne(ref Linika[] z, ref bool *c, ref Size samLoto, ref ZdjecieZPozycją logo) { Point Sierodek = new Point(samLoto.Width, samLoto.Height).Razy(0.5f); Point WielkoścL = new Point(logo.Obszar.Width, logo.Obszar.Height).Razy(0.5f); Sierodek = logo.Obszar.Location.Dodaj(WielkoścL).Odejmij(Sierodek); double XDoY = samLoto.Width; XDoY /= samLoto.Height; double d = (Math.PI + Math.Atan2(Sierodek.X, Sierodek.Y * XDoY)); double Pi4 = Math.PI / 4; double Pi2 = Math.PI / 2; if (d < Pi4 || d > (Math.PI * 2) - Pi4) { WykonanyObrót = RodzajObrotu.Brak; return(false); } else if (d < Pi2 + Pi4) { WykonanyObrót = RodzajObrotu.ObrótPlus90; OperacjeNaStrumieniu.ObrótPlus90((byte *)c, ref samLoto); } else if (d < Pi4 + 2 * Pi2) { WykonanyObrót = RodzajObrotu.Obrót180; OperacjeNaStrumieniu.Obrót180((byte *)c, samLoto); } else if (d < Pi4 + 3 * Pi2) { WykonanyObrót = RodzajObrotu.obrótMin90; OperacjeNaStrumieniu.ObrótMin90((byte *)c, ref samLoto); } else { throw new NotImplementedException("coś poszło nie tak "); } z = PodzielNaLiniki(ref c, ref samLoto, out logo); return(true); }