예제 #1
0
        private void Segmentate(RawImage image, string slapOut, string prefix, string extension = ".bmp", bool single = false)
        {
            using (SegmentationResult result = _iSegLib.SegmentFingerprints(image, _expectedFingersCount, _minimumFingersCount, _maximumFingersCount, _maxRotation, SegmentationOptions.None, _outWidth, _outHeight, _bcgValue))
            {
                Image boxedImage = result.BoxedImage;
                boxedImage.Save(slapOut);

                var size = single ? 1 : result.Fingerprints.Length;

                for (int i = 0; i < size; i++)
                {
                    var    fingerprintseg = result.Fingerprints[i];
                    string fileName       = prefix + (i + 1) + extension;
                    using (Image fpImage = fingerprintseg.RawImage.ConvertRawToImage())
                    {
                        fpImage.Save(fileName);
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Find optimal segment length given number of segments and error function (signed error).
        /// Newton's method is used to find the segment length.
        /// </summary>
        /// <param name="numSegments">Desired number of segments along the curve.</param>
        /// <param name="errorFunc">Error function that calculates the signed error given segment points.</param>
        /// <param name="globalTolerance">Global tolerance when to exit Newton's method.</param>
        /// <param name="localTolerance">Local curve tolerance when traversing this curve.</param>
        /// <param name="maxNumIterations">Maximum number of iterations before exiting.</param>
        /// <returns>Segmentation result with resulting segment length and error.</returns>
        public SegmentationResult FindSegmentLength(int numSegments,
                                                    Func <PointCurve, SegmentPoint, SegmentPoint, SegmentType, float> errorFunc,
                                                    float globalTolerance = 1.0E-3f,
                                                    float localTolerance  = 1.0E-5f,
                                                    int maxNumIterations  = 100)
        {
            var result = new SegmentationResult()
            {
                NumSegments   = numSegments,
                Error         = float.PositiveInfinity,
                NumIterations = 0,
                SegmentLength = -1.0f,
                Successful    = false
            };

            var totalLength = TotalLength;

            if (totalLength <= 0.0f || numSegments < 1)
            {
                return(result);
            }

            result.SegmentLength = totalLength / numSegments;

            var dl         = 1.0E-3f / numSegments;
            var bestResult = new SegmentationResult()
            {
                NumSegments   = numSegments,
                Error         = float.PositiveInfinity,
                NumIterations = 0,
                SegmentLength = -1.0f,
                Successful    = false
            };

            try {
                var done = false;
                while (!done && result.NumIterations++ < maxNumIterations)
                {
                    var ePrev = 0.0f;
                    var eCurr = 0.0f;
                    var eNext = 0.0f;

                    Traverse((s1, s2, sType) =>
                    {
                        ePrev += errorFunc(this, s1, s2, sType);
                    }, result.SegmentLength - dl, localTolerance);

                    Traverse((s1, s2, sType) =>
                    {
                        eCurr += errorFunc(this, s1, s2, sType);
                    }, result.SegmentLength, localTolerance);

                    Traverse((s1, s2, sType) =>
                    {
                        eNext += errorFunc(this, s1, s2, sType);
                    }, result.SegmentLength + dl, localTolerance);

                    if (eCurr < bestResult.Error)
                    {
                        bestResult       = result;
                        bestResult.Error = eCurr;
                    }

                    var dr = -2.0f * dl * eCurr / (eNext - ePrev);
                    result.SegmentLength += dr;

                    if (eNext == ePrev ||
                        result.NumIterations == maxNumIterations ||
                        result.SegmentLength - dl < 1.0E-6f)
                    {
                        return(bestResult);
                    }

                    result.Error = 0.0f;
                    Traverse((s1, s2, sType) =>
                    {
                        result.Error += errorFunc(this, s1, s2, sType);
                    }, result.SegmentLength, localTolerance);

                    done = Mathf.Abs(result.Error) < globalTolerance;
                }

                result.Successful = done;
                if (result.Successful)
                {
                    m_lastResult = result;
                }

                return(result);
            }
            catch (System.Exception) {
                return(bestResult);
            }
        }
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SegmentationResult obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }