示例#1
0
        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)
                        {
                        }
                    }
                }
            }
        }
示例#2
0
        //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));
        }
示例#3
0
        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));
        }
示例#4
0
 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);
 }
示例#7
0
        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)
                    {
                    }
                }
            }
        }
示例#8
0
 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)));
 }