public void MatchMinutia(Bitmap bitmap, Color color, Minutia minutia) { int xo = minutia.p.X, yo = minutia.p.Y;// center of circle int r, rr; r = 3; //rr =(int)( Math.Pow(r, 2)); for (int i = xo - (int)r; i <= xo + r; i++) { for (int j = yo - (int)r; j <= yo + r; j++) { if (Math.Abs(Math.Sqrt(Math.Pow(i - xo, 2) + Math.Pow(j - yo, 2)) - (float)r) < 0.5f) { try { bitmap.SetPixel(i, j, color); } catch (Exception ex) { } } } } }
//metoda zwracająca wartość przesunięcia obrazu, aby dwie minucje pokryły się na obrazie już obruconym o zandany kąt q private Point getShift(Minutia n, Minutia d, double q) //miara kątowa jest tu w stopniach trzeba będzie je zamienić na radiany, d to minucja z wektora bazy minucji z bazy danych // n to minucja z wektora minucji niwej analizowanje minucji { int deltaX = (int)(d.p.X - (Math.Cos(q) * n.p.X - Math.Sin(q) * n.p.Y) + 0.5); int deltaY = (int)(d.p.Y - (Math.Sin(q) * n.p.X + Math.Cos(q) * n.p.Y) + 0.5); return(new Point(deltaX, deltaY)); }
private Minutia MapMinutia(Minutia m, ModyficationElement em)//działa poprawnie sprawdzone { // em = new ModyficationElement(-10, 5, 30); double angle = ImageSupporter.DegreeToRadian(em.angle); int x = (int)(Math.Cos(angle) * m.p.X - Math.Sin(angle) * m.p.Y + em.x + 0.5); int y = (int)(Math.Sin(angle) * m.p.X + Math.Cos(angle) * m.p.Y + em.y + 0.5); double angle2 = m.direction + angle;//tutaj nie jestem pewny z kontem return(new Minutia(new Point(x, y), angle2, m.kind)); }
private bool mm(Minutia m, Minutia prim) { if (sd(m, prim) <= LimitMove /*&& dd(m.direction, prim.direction) <= LimitRotate*/) { return(true); } else { return(false); } }
//metoda zaznaczająca minucje na bitmapie public static void MatchMinutia2(Bitmap bitmap, Color zakonczenie, Color rozwidlenie, Minutia minutia) { int xo = minutia.p.X, yo = minutia.p.Y;// center of circle int r, rr; r = 3; Color color; if (minutia.kind.Equals(KindOfMinutia.ZAKONCZENIE)) { color = zakonczenie; } else { color = rozwidlenie; } for (int i = xo - (int)r; i <= xo + r; i++) { for (int j = yo - (int)r; j <= yo + r; j++) { if (Math.Abs(Math.Sqrt(Math.Pow(i - xo, 2) + Math.Pow(j - yo, 2)) - (float)r) < 0.5f) { try { bitmap.SetPixel(i, j, color); } catch (Exception ex) { } } } } }
public void Add(Minutia m) { this.m.Add(m); }
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 double sd(Minutia m1, Minutia m2) { return(Math.Sqrt(Math.Pow(m1.p.X - m2.p.X, 2) + Math.Pow(m1.p.Y - m2.p.Y, 2))); }