public Dictionary <Point, int> getSectionPixels(Point c, Bitmap orginal, int sectionLeng) { double angle = localDirectionMap.getDirectionForPixel(c.X, c.Y); angle = ImageSupporter.restrictAngle(angle); Point p = new Point((int)(c.X - Math.Sin(angle) * sectionLeng + 0.5), (int)(c.Y - Math.Cos(angle) * sectionLeng + 0.5)); Point k = new Point((int)(c.X + Math.Sin(angle) * sectionLeng + 0.5), (int)(c.Y + Math.Cos(angle) * sectionLeng + 0.5)); if (ImageSupporter.RadianToDegree(angle) > 80 && ImageSupporter.RadianToDegree(angle) < 100) { double ck = ImageSupporter.RadianToDegree(angle); } Dictionary <Point, int> section = new Dictionary <Point, int>(); foreach (var item in ImageSupporter.EnumerateLineNoDiagonalSteps(p.X, p.Y, k.X, k.Y)) { try { section.Add(new Point(item.Item1, item.Item2), orginal.GetPixel(item.Item1, item.Item2).R); } catch (Exception e) { } } return(section); }
private void followingDown(Point m) { double angle = localDirectionMap.getDirectionForPixel(m.X, m.Y); angle = ImageSupporter.angletoIIIandIV(angle); Point n = new Point((int)(m.X - Math.Cos(angle) * dlugoscSkoku + 0.5), (int)(m.Y + Math.Sin(angle) * dlugoscSkoku + 0.5)); if (n.X < training.Width && n.X > 0 && n.Y > 0 && n.Y < training.Height) { //if (orginalBitmap.GetPixel(n.X, n.Y).R < limit && alreadyPassed.GetPixel(n.X, n.Y).B!=128) //{ Dictionary <Point, int> sectionLine = getSectionPixels(n, orginalBitmap, startingSectionLen); foreach (var item in sectionLine) { training.SetPixel(item.Key.X, item.Key.Y, Color.Red); } Point p = sectionMinimum(sectionLine, alreadyPassed); List <Point> points = ImageSupporter.GetLine(m, p); bool flag = true; foreach (var item in points) { if (orginalBitmap.GetPixel(item.X, item.Y).R > limit) { flag = false; } } if (/*orginalBitmap.GetPixel(p.X, p.Y).R< limit*/ flag && alreadyPassed.GetPixel(p.X, p.Y).B != 128) //if (orginalBitmap.GetPixel(p.X, p.Y).R < limit && alreadyPassed.GetPixel(p.X, p.Y).B != 128) { for (int a = p.X - 1; a < p.X + 2; a++) { for (int b = p.Y - 1; b < p.Y + 2; b++) { try { // if(a<training.Width&&a>0&&b<training.Height&&b>0) // training.SetPixel(a, b, Color.Blue); } catch (Exception e) { } } } ImageSupporter.matchLine2(alreadyPassed, m, n, standard, 5); ImageSupporter.matchLine2(training, m, n, Color.Pink, 1); if (ImageSupporter.RadianToDegree( Math.Abs( localDirectionMap .getDirectionForPixel(p.X, p.Y) - localDirectionMap.getDirectionForPixel(m.X, m.Y))) > 100) { followingUp(p); } else { followingDown(p); } } else if (alreadyPassed.GetPixel(p.X, p.Y).B == 128 && flag) { List <Point> list = ImageSupporter.GetLine(m, n); Point wsk = p; foreach (Point pi in list) { wsk = pi; int i = orginalBitmap.GetPixel(pi.X, pi.Y).R; if (orginalBitmap.GetPixel(pi.X, pi.Y).B != 128) { } else { break; } } // minucje.Add(new Tuple<Point,double>(wsk, angle)); try { for (int a = wsk.X - 1; a < wsk.X + 2; a++) { for (int b = wsk.Y - 1; b < wsk.Y + 2; b++) { // training.SetPixel(a, b, Color.Yellow); } } //int i = orginalBitmap.GetPixel(wsk.X, wsk.Y).R; //training.SetPixel(wsk.X, wsk.Y, Color.Orange); } catch (Exception ec) { } } // else if(orginalBitmap.GetPixel(p.X, p.Y).R >= limit) else //if( !flag&& alreadyPassed.GetPixel(p.X, p.Y).B != 128) { // training.SetPixel(n.X, n.Y, Color.Orange); List <Point> list = ImageSupporter.GetLine(m, n); Point wsk = n; foreach (Point pi in list) { // int i = orginalBitmap.GetPixel(pi.X, pi.Y).R; if (orginalBitmap.GetPixel(pi.X, pi.Y).R < limit) { } else { wsk = pi; break; } } Minutia newMinutia; if (!inverted) { newMinutia = new Minutia(wsk, angle, KindOfMinutia.ZAKONCZENIE); } else { newMinutia = new Minutia(wsk, angle, KindOfMinutia.ROZWIDLENIE); } minucje.Add(newMinutia); ImageSupporter.MatchMinutia2(training, Color.Orange, Color.Purple, newMinutia); try { for (int a = wsk.X - 1; a < wsk.X + 2; a++) { for (int b = wsk.Y - 1; b < wsk.Y + 2; b++) { // training.SetPixel(a, b, Color.Orange); } } //int i = orginalBitmap.GetPixel(wsk.X, wsk.Y).R; //training.SetPixel(wsk.X, wsk.Y, Color.Orange); } catch (Exception ec) { } } } }
private int GetAngle(MinutiaWektor froDatabase, MinutiaWektor scaned) { int[] ballotDodatni = new int[45]; int[] ballotUjemny = new int[45]; foreach (var d in froDatabase.m) //wektor minucji z bazy danych { foreach (var n in scaned.m) //wektor minucji analizowanego odcisku { // for (int angle = angleRangeBottom; angle < angleRangeTop; angle += angleJump) //{ //if (dd(n.direction + ImageSupporter.DegreeToRadian(angle), d.direction) < LimitRotate) //{ //double katPrzesuniecia = dd(n.direction, d.direction); int katPrzesuniecia = (int)(ImageSupporter.RadianToDegree(ddd(n.direction, d.direction)) + 0.5); if (katPrzesuniecia > 0) { if (katPrzesuniecia < 45) { ballotDodatni[katPrzesuniecia]++; } } else { if (Math.Abs(katPrzesuniecia) < 45) { ballotUjemny[katPrzesuniecia]++; } } //int index=(angle - angleRangeBottom) / angleJump; //ballot[index] += 1; //} //} } } int maxDodatni = 0; int katDodatnik = 0; for (int i = 0; i < ballotDodatni.Length; i++) { if (maxDodatni < ballotDodatni[i]) { } } for (int i = 0; i < ballotUjemny.Length; i++) { } /* int j = 0; * int ang = 0; * for(int i=0;i<ballot.Length;i++) * { * if(ballot[i]>ang) * { * i = j; * ang = ballot[i]; * * } * }*/ //return angleRangeBottom + j * angleJump; return(0); }