public async Task <FingerprintModel> CompareImages(Image input) { BFMatcher bF = new BFMatcher(DistanceType.Hamming); VectorOfDMatch matches = new VectorOfDMatch(); var descriptorToCompare = FingerprintDescriptor( BitConvert.GetMatFromImage(input) ); var AllFingerPrints = await _fingerPrintData.GetAll(); foreach (FingerprintModel fingerprintDatabase in AllFingerPrints) { var descriptorDatabase = FingerprintDescriptor( BitConvert.GetMatFromImage( fingerprintDatabase.GetFingerPrintImage() ) ); //Here you put the firgerPrint's Mat you want to compare. bF.Match(descriptorToCompare, descriptorDatabase, matches); //Algorithm to Compare fingerprints //Calculate score float score = 0; foreach (MDMatch match in matches.ToArray()) { score += match.Distance; } float score_threshold = 33; if (score / matches.ToArray().Length < score_threshold) { return(fingerprintDatabase); } else { continue; } } return(null); }
/// <summary> /// Performs images matching. /// </summary> /// <param name="features1">First image features</param> /// <param name="features2">Second image features</param> /// <returns>Found matches</returns> public virtual MatchesInfo Apply( ImageFeatures features1, ImageFeatures features2) { ThrowIfDisposed(); if (features1 == null) { throw new ArgumentNullException(nameof(features1)); } if (features2 == null) { throw new ArgumentNullException(nameof(features2)); } if (features1.Descriptors == null) { throw new ArgumentException($"{nameof(features1)}.Descriptors == null", nameof(features1)); } if (features2.Descriptors == null) { throw new ArgumentException($"{nameof(features2)}.Descriptors == null", nameof(features1)); } features1.Descriptors.ThrowIfDisposed(); features2.Descriptors.ThrowIfDisposed(); using var keypointsVec1 = new VectorOfKeyPoint(features1.Keypoints); using var keypointsVec2 = new VectorOfKeyPoint(features2.Keypoints); var features1Cpp = new WImageFeatures { ImgIdx = features1.ImgIdx, ImgSize = features1.ImgSize, Keypoints = keypointsVec1.CvPtr, Descriptors = features1.Descriptors.CvPtr, }; var features2Cpp = new WImageFeatures { ImgIdx = features2.ImgIdx, ImgSize = features2.ImgSize, Keypoints = keypointsVec2.CvPtr, Descriptors = features2.Descriptors.CvPtr, }; using var matchesVec = new VectorOfDMatch(); using var inliersMaskVec = new VectorOfByte(); var h = new Mat(); NativeMethods.HandleException( NativeMethods.stitching_FeaturesMatcher_apply( ptr, ref features1Cpp, ref features2Cpp, out var srcImgIdx, out var dstImgIdx, matchesVec.CvPtr, inliersMaskVec.CvPtr, out var numInliers, h.CvPtr, out var confidence)); GC.KeepAlive(this); return(new MatchesInfo( srcImgIdx, dstImgIdx, matchesVec.ToArray(), inliersMaskVec.ToArray(), numInliers, h, confidence)); }
/// <summary> /// Find one best match for each query descriptor (if mask is empty). /// </summary> /// <param name="queryDescriptors"></param> /// <param name="masks"></param> /// <returns></returns> public DMatch[] Match(Mat queryDescriptors, Mat[] masks = null) { ThrowIfDisposed(); if (queryDescriptors == null) throw new ArgumentNullException("queryDescriptors"); var masksPtrs = new IntPtr[0]; if (masks != null) { masksPtrs = EnumerableEx.SelectPtrs(masks); } using (var matchesVec = new VectorOfDMatch()) { NativeMethods.features2d_DescriptorMatcher_match2( ptr, queryDescriptors.CvPtr, matchesVec.CvPtr, masksPtrs, masksPtrs.Length); return matchesVec.ToArray(); } }
/// <summary> /// Find one best match for each query descriptor (if mask is empty). /// </summary> /// <param name="queryDescriptors"></param> /// <param name="trainDescriptors"></param> /// <param name="mask"></param> /// <returns></returns> public DMatch[] Match(Mat queryDescriptors, Mat trainDescriptors, Mat mask = null) { ThrowIfDisposed(); if (queryDescriptors == null) throw new ArgumentNullException("queryDescriptors"); if (trainDescriptors == null) throw new ArgumentNullException("trainDescriptors"); using (var matchesVec = new VectorOfDMatch()) { NativeMethods.features2d_DescriptorMatcher_match1( ptr, queryDescriptors.CvPtr, trainDescriptors.CvPtr, matchesVec.CvPtr, Cv2.ToPtr(mask)); return matchesVec.ToArray(); } }
/// <summary> /// /// </summary> /// <returns></returns> public DMatch[] ReadDMatches() { using (var valueVector = new VectorOfDMatch()) { NativeMethods.core_FileNode_read_vectorOfDMatch(ptr, valueVector.CvPtr); return valueVector.ToArray(); } }