Esempio n. 1
0
        private void ViewMinus()
        {
            Pen      pen  = new Pen(Color.Red, 1);
            Pen      pen1 = new Pen(Color.Blue, 2);
            Graphics g    = Graphics.FromImage(pic1.Image);

            for (int index = 0; index < minus1.Count; index++)
            {
                Minutiae minu = (Minutiae)minus1[index];
                g.DrawRectangle(pen, minu.X - 2, minu.Y - 2, 5, 5);
                g.DrawLine(pen1, minu.X, minu.Y, minu.X + Convert.ToInt32(15 * Math.Cos(minu.Direct)), minu.Y - Convert.ToInt32(15 * Math.Sin(minu.Direct)));
            }
            pic1.Refresh();
            g.Dispose();

            //Pen pen = new Pen(Color.Red,1);
            //Pen pen1 = new Pen(Color.Blue,2);
            Graphics g1 = Graphics.FromImage(pic2.Image);

            for (int index = 0; index < minus2.Count; index++)
            {
                Minutiae minu = (Minutiae)minus2[index];
                g1.DrawRectangle(pen, minu.X - 2, minu.Y - 2, 5, 5);
                g1.DrawLine(pen1, minu.X, minu.Y, minu.X + Convert.ToInt32(15 * Math.Cos(minu.Direct)), minu.Y - Convert.ToInt32(15 * Math.Sin(minu.Direct)));
            }
            pic2.Refresh();
            g1.Dispose();
        }
Esempio n. 2
0
        public static bool IsMinutiaeMatching(Minutiae m1, Minutiae m2, int distanceLimit, double angleLimit, Minutiae minuChanging)
        {
            Minutiae m           = m2.GetMinutiaeAfterChange(minuChanging.X, minuChanging.Y, minuChanging.Direct, 128, 128);
            int      distance    = Convert.ToInt32(Math.Sqrt(Math.Pow(m.X - m1.X, 2) + Math.Pow(m.Y - m1.Y, 2)));
            double   angleRotate = Math.Min(Math.Abs(m.Direct - m1.Direct), Math.PI * 2 - Math.Abs(m.Direct - m1.Direct));

            if ((distance < distanceLimit) && (angleRotate < angleLimit))
            {
                return(true);
            }
            return(false);
        }
Esempio n. 3
0
        public ArrayList GetMinutiae(int leftPading, int topPadding, int rightPadding, int bottomPadding)
        {
            ArrayList minus1 = new ArrayList();

            for (int x = leftPading; x < width - rightPadding; x++)
            {
                for (int y = topPadding; y < height - bottomPadding; y++)
                {
                    if (this.IsFeature(x, y))
                    {
                        minus1.Add(new Minutiae(x, y, direct[x, y]));
                    }
                }
            }

            #region Clear Minutiae
            for (int i = 0; i < minus1.Count - 1; i++)
            {
                Minutiae m1 = (Minutiae)minus1[i];
                for (int j = i + 1; j < minus1.Count; j++)
                {
                    Minutiae m2 = (Minutiae)minus1[j];
                    if (Functions.GetMinuDistance(m1, m2) < 6)
                    {
                        if (i > 0)
                        {
                            minus1.RemoveAt(j);
                            minus1.RemoveAt(i);
                            j = j - 2;
                            i--;
                            break;
                        }
                        else
                        {
                            minus1.RemoveAt(j);
                            minus1.RemoveAt(i);
                            if (j > 1)
                            {
                                j--;
                            }
                            break;
                        }
                    }
                }
            }
            #endregion
            return(minus1);
        }
Esempio n. 4
0
        private void button5_Click(object sender, System.EventArgs e)
        {
            ArrayList minus = image.GetMinutiae(50, 20, 50, 20);

            Pen      pen  = new Pen(Color.Red, 1);
            Pen      pen1 = new Pen(Color.Blue, 2);
            Graphics g    = Graphics.FromImage(picOutput.Image);

            for (int index = 0; index < minus.Count; index++)
            {
                Minutiae minu = (Minutiae)minus[index];
                g.DrawRectangle(pen, minu.X - 2, minu.Y - 2, 5, 5);
                g.DrawLine(pen1, minu.X, minu.Y, minu.X + Convert.ToInt32(15 * Math.Cos(minu.Direct)), minu.Y - Convert.ToInt32(15 * Math.Sin(minu.Direct)));
            }
            picOutput.Refresh();
            g.Dispose();

            MessageBox.Show("Số lượng chi tiết: " + minus.Count.ToString());
        }
Esempio n. 5
0
        public static int CountMinuMatching(ArrayList minuSet1, ArrayList minuSet2, Minutiae minuChanging, int distanceLimit, double angleLimit)
        {
            int i, j;

            bool[] mark = new bool[minuSet2.Count];
            for (i = 0; i < minuSet2.Count; i++)
            {
                mark[i] = false;
            }

            for (i = 0; i < minuSet1.Count; i++)
            {
                Minutiae m1 = (Minutiae)minuSet1[i];
                for (j = 0; j < minuSet2.Count; j++)
                {
                    if (!mark[j])
                    {
                        Minutiae m2 = (Minutiae)minuSet2[j];
                        if (Functions.IsMinutiaeMatching(m1, m2, distanceLimit, angleLimit, minuChanging))
                        {
                            mark[j] = true;
                            break;
                        }
                    }
                }
            }
            int count = 0;

            for (i = 0; i < minuSet2.Count; i++)
            {
                if (mark[i])
                {
                    count++;
                }
            }
            return(count);
        }
Esempio n. 6
0
 public static int GetMinuDistance(Minutiae m1, Minutiae m2)
 {
     return(Convert.ToInt32(Math.Sqrt(Math.Pow(m1.X - m2.X, 2) + Math.Pow(m1.Y - m2.Y, 2))));
 }
Esempio n. 7
0
        private void menuItem6_Click(object sender, System.EventArgs e)
        {
            try
            {
                int i, j;
                if (!isFirst1)
                {
                    int[,] input1 = new int[width1, height1];
                    for (i = 0; i < width1; i++)
                    {
                        for (j = 0; j < height1; j++)
                        {
                            input1[i, j] = image1Data[i, j];
                        }
                    }

                    image1.SetImage(input1, width1, height1, widthSquare);
                }
                if (!isFirst2)
                {
                    int[,] input2 = new int[width2, height2];
                    for (i = 0; i < width2; i++)
                    {
                        for (j = 0; j < height2; j++)
                        {
                            input2[i, j] = image2Data[i, j];
                        }
                    }
                    image2.SetImage(input2, width2, height2, widthSquare);
                }
                this.Cursor = Cursors.WaitCursor;

                #region prepare data
                statueP2.Text = "Đang chuẩn hóa";
                image1.ToNornal(m, v);
                image2.ToNornal(m, v);

                statueP2.Text = "Đang tăng cường";
                image1.ToFiltring(widthSquare, f, fi);
                image2.ToFiltring(widthSquare, f, fi);

                statueP2.Text = "Đang nhị phân hóa";
                image1.ToBinary(threshold);
                image2.ToBinary(threshold);

                statueP2.Text = "Đang làm mảnh";
                image1.ToBoneImage();
                image2.ToBoneImage();

                minus1.Clear();
                minus2.Clear();
                minus1 = image1.GetMinutiae(left1, top1, right1, bottom1);
                minus2 = image2.GetMinutiae(left2, top2, right2, bottom2);
                #endregion

                #region run hough
                //int i;
                //angles
                int   angleStart  = -30;
                int   angleUnit   = 3;
                int   angleFinish = 30;
                int   anglesCount = Convert.ToInt32((angleFinish - angleStart) / angleUnit) + 1;
                int[] angleSet    = new int[anglesCount];
                i = 0;
                int angle = angleStart;
                while (i < anglesCount)
                {
                    angleSet[i] = angle;
                    i++;
                    angle += angleUnit;
                }
                //DELTAXSET
                int   deltaXStart  = -image1.Width;
                int   deltaXFinish = image1.Width;
                int   deltaXUnit   = 2;
                int   deltaXCount  = Convert.ToInt32((deltaXFinish - deltaXStart) / deltaXUnit) + 1;
                int[] deltaXSet    = new int[deltaXCount];
                i = 0;
                int deltaX = deltaXStart;
                while (i < deltaXCount)
                {
                    deltaXSet[i] = deltaX;
                    i++;
                    deltaX += deltaXUnit;
                }
                //DELTAYSET
                int   deltaYStart  = -image1.Height;
                int   deltaYFinish = image1.Height;
                int   deltaYUnit   = 2;
                int   deltaYCount  = Convert.ToInt32((deltaYFinish - deltaYStart) / deltaYUnit) + 1;
                int[] deltaYSet    = new int[deltaYCount];
                i = 0;
                int deltaY = deltaYStart;
                while (i < deltaYCount)
                {
                    deltaYSet[i] = deltaY;
                    i++;
                    deltaY += deltaYUnit;
                }

                //scaleset
                double[] scaleSet = { 0.8, 0.9, 1.0, 1.1, 1.2 };
                minuResult = Functions.GetMinutiaeChanging_UseHoughTransform(minus1, minus2, angleSet, deltaXSet, deltaYSet, angleLimit * Math.PI / 180, image1.Width / 2, image1.Height / 2);
                int count = Functions.CountMinuMatching(minus1, minus2, minuResult, distanceLimit, angleLimit * Math.PI / 180);
                if (count >= minuNumberLimit)
                {
                    MessageBox.Show("Hai vân tay trùng khớp");
                }
                else
                {
                    MessageBox.Show("Hai vân tay không trùng khớp");
                }
                sResult = "Tịnh tiến trục X:" + minuResult.X.ToString() + "\nTịnh tiến trục Y:" + minuResult.Y.ToString() + "\nGóc quay:" + Convert.ToString(minuResult.Direct * 180 / Math.PI) + "\n Số lượng chi tiết trùng khớp:" + count.ToString();
                #endregion

                statueP2.Text = "Đã hoàn thành";
                this.Cursor   = Cursors.Default;
                isFirst1      = false;
                isFirst2      = false;
            }
            catch
            {
                MessageBox.Show("Lỗi xử lý");
            }
        }