private void TestToIsoTemplate(IEnumerable <MinutiaRecord> minutae, string isoTemplateHex) { // Get the IsoTemplate byte[] template = IsoTemplateHelper.ToIsoTemplate(minutae); // Convert the IsoTemplate back to a list of minutia (loss of data in casting) IEnumerable <MinutiaRecord> convert_minutae = IsoTemplateHelper.ToMinutae(template); // Convert it to Hex for comparison string templateHex = BitConverter.ToString(template); templateHex = templateHex.Replace("-", String.Empty); // Assertions CollectionAssert.AreEqual(IsoTemplateHelper.ToByteArray(isoTemplateHex), template); Assert.AreEqual(minutae.Count(), convert_minutae.Count()); for (int i = 0; i < convert_minutae.Count(); i++) { MinutiaRecord real_minutia = minutae.ElementAt(i); MinutiaRecord converted_minutia = convert_minutae.ElementAt(i); Assert.AreEqual((int)real_minutia.Position.X, converted_minutia.Position.X); Assert.AreEqual((int)real_minutia.Position.Y, converted_minutia.Position.Y); // y(x,a) = ax - floor(ax) // max(y(x,a)) = 1, min(y(x,a)) = 0 // e(x,a) = x - x_hat = 1/a * floor(ax) = 1/a * y(x,a) // Thus max(e(x,a)) = 1/a, min(e(x,a)) = 0 Assert.IsTrue(real_minutia.Angle - converted_minutia.Angle < 1.0 / (256 / 360)); } }
public override void OnEnteringState() { base.OnEnteringState(); Outer.OnUserActionRequired(new UserActionRequiredEventArgs(SET_ANGLE_PROMPT)); // Get the minutia that was placed in the previous step IntegrityCheck.AreNotEqual(0, Outer.Minutae.Count()); m_Record = Outer.Minutae.Last(); IntegrityCheck.IsNotNull(m_Record.Position); }
public static IEnumerable <MinutiaRecord> ToMinutae(byte[] isoTemplate) { IntegrityCheck.IsNotNull(isoTemplate); // TODO: IntegrityCheck start is HEADER_TOP // TODO: IntegrityCheck HEADER_BOTTOM int headerTopCount = ToByteArray(HEADER_TOP).Count(); // TODO: Make constant int minutiaCount_1 = ToMinutiaCount(isoTemplate[headerTopCount]); int headerBottomCount = ToByteArray(HEADER_BOTTOM).Count(); // TODO: Make constant int minutiaCount_2 = (UInt16)isoTemplate[headerTopCount + 1 + headerBottomCount]; // TODO: IntegrityCheck minutiaCount_1 == minutiaCount_2 int minutiaCount = minutiaCount_1; int startByte = headerTopCount + 1 + headerBottomCount + 1; // TODO: Make constant int bytesPerMinutia = 6; // TODO: Make constant List <MinutiaRecord> minutae = new List <MinutiaRecord>(minutiaCount); for (int i = 0; i < minutiaCount; i++) { MinutiaType type = TypeToMinutiaType(isoTemplate[startByte]); // TODO: IntegrityCheck type != None // Get Minutia X-Position int x = (UInt16)isoTemplate[startByte + 1]; // Get Minutia Y-Position byte[] yData = new byte[2]; Array.Copy(isoTemplate, startByte + 2, yData, 0, 2); int y = YToInt(yData); // Get Minutia angle from the two angle bytes. double angle = AngleToDouble(isoTemplate[startByte + 4]); // TODO: IntegrityCheck quality // Create minutia from data and add to list. MinutiaRecord minutia = new MinutiaRecord( new System.Windows.Point(x, y), angle, type); minutae.Add(minutia); startByte += bytesPerMinutia; } // TODO: More assertions return(minutae); }
public override void PositionInput(Point position) { // The user is starting to record a new minutia // Start a new minutia data record. MinutiaRecord record = new MinutiaRecord(); // Save the position record.Position = position; // Save the current type. record.Type = Outer.InputMinutiaType; // Record minutia information. Outer.Minutae.Add(record); // Indicate next input defines the direction. TransitionTo(typeof(WaitDirection)); }
private static string ToRecord(MinutiaRecord labels) { return(String.Format("{0}, {1}, {2}, {3}", labels.Position.X, labels.Position.Y, labels.Angle, labels.Type)); }