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(); }
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); }
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); }
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()); }
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); }
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)))); }
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ý"); } }