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); } } } }
/// <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); }