Exemple #1
0
        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));
            }
        }
Exemple #2
0
            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);
        }
Exemple #4
0
            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));
            }
Exemple #5
0
 private static string ToRecord(MinutiaRecord labels)
 {
     return(String.Format("{0}, {1}, {2}, {3}",
                          labels.Position.X, labels.Position.Y, labels.Angle, labels.Type));
 }