public static void testCall(string checkImage, string SearchInImage) { long matchTime; int InlierThreshold = 10; int outlier; using (Image<Gray, Byte> modelImage = new Image<Gray, byte>(checkImage)) using (Image<Gray, Byte> observedImage = new Image<Gray, byte>(SearchInImage)) //using (Image<Gray, Byte> observedImage = new Image<Gray, byte>("NoBoy3.jpg")) { //Image<Bgr, byte> result = DrawMatches.Draw(modelImage, observedImage, out matchTime); Image<Bgr, byte> result = BruteForceMatcher.Draw(modelImage, observedImage, out matchTime, out InlierThreshold, out outlier); //ImageViewer.Show(result, String.Format("Matched using {0} in {1} milliseconds", GpuInvoke.HasCuda ? "GPU" : "CPU", matchTime)); Console.WriteLine("Matched using {0} in {1} milliseconds", GpuInvoke.HasCuda ? "GPU" : "CPU", matchTime); } }
public static FindMatchResult FindMatchInSource(MatchInput matchInput) { FindMatchResult matchResult = new FindMatchResult(); long matchTime; int inLiers, outLiers; string MatchFolderPath, MatchFile, MatchAbsolutePath, MatchedFaceFile; MatchFolderPath = MatchFile = MatchedFaceFile = MatchAbsolutePath = ""; //file folders assignment MatchFolderPath = matchInput.WebFolderPath; MatchAbsolutePath = matchInput.FindInFile.DirectoryName + "\\" + "MatchFiles"; using (Image <Gray, Byte> modelImage = new Image <Gray, byte>(matchInput.MatchFile.FullName)) using (Image <Gray, Byte> observedImage = new Image <Gray, byte>(matchInput.FindInFile.FullName)) { Image <Bgr, byte> result = BruteForceMatcher.Draw(modelImage, observedImage, out matchTime, out inLiers, out outLiers); //ImageViewer.Show(result, String.Format("Matched using {0} in {1} milliseconds", GpuInvoke.HasCuda ? "GPU" : "CPU", matchTime)); if (inLiers > matchInput.InlierThreshold) { matchResult.Matched = true; MatchedFaceFile = Guid.NewGuid().ToString(); bool exists = System.IO.Directory.Exists(MatchAbsolutePath); if (!exists) { System.IO.Directory.CreateDirectory(MatchAbsolutePath); } result.Save(MatchAbsolutePath + "\\" + MatchedFaceFile + matchInput.FindInFile.Extension); } matchResult.Inliers = inLiers; matchResult.Outliers = outLiers; matchResult.FolderPath = MatchFolderPath; matchResult.AbsolutePath = MatchAbsolutePath + "\\"; matchResult.MatchedFaceFile = MatchedFaceFile; } return(matchResult); }
public static void FindMatch(Image<Gray, Byte> modelImage, Image<Gray, byte> observedImage, out long matchTime, out VectorOfKeyPoint modelKeyPoints, out VectorOfKeyPoint observedKeyPoints, out Matrix<int> indices, out Matrix<byte> mask, out HomographyMatrix homography) { int k = 2; double uniquenessThreshold = 0.8; SURFDetector surfCPU = new SURFDetector(500, false); Stopwatch watch; homography = null; #if !IOS if (GpuInvoke.HasCuda) { GpuSURFDetector surfGPU = new GpuSURFDetector(surfCPU.SURFParams, 0.01f); using (GpuImage<Gray, Byte> gpuModelImage = new GpuImage<Gray, byte>(modelImage)) //extract features from the object image using (GpuMat<float> gpuModelKeyPoints = surfGPU.DetectKeyPointsRaw(gpuModelImage, null)) using (GpuMat<float> gpuModelDescriptors = surfGPU.ComputeDescriptorsRaw(gpuModelImage, null, gpuModelKeyPoints)) using (GpuBruteForceMatcher<float> matcher = new GpuBruteForceMatcher<float>(DistanceType.L2)) { modelKeyPoints = new VectorOfKeyPoint(); surfGPU.DownloadKeypoints(gpuModelKeyPoints, modelKeyPoints); watch = Stopwatch.StartNew(); // extract features from the observed image using (GpuImage<Gray, Byte> gpuObservedImage = new GpuImage<Gray, byte>(observedImage)) using (GpuMat<float> gpuObservedKeyPoints = surfGPU.DetectKeyPointsRaw(gpuObservedImage, null)) using (GpuMat<float> gpuObservedDescriptors = surfGPU.ComputeDescriptorsRaw(gpuObservedImage, null, gpuObservedKeyPoints)) using (GpuMat<int> gpuMatchIndices = new GpuMat<int>(gpuObservedDescriptors.Size.Height, k, 1, true)) using (GpuMat<float> gpuMatchDist = new GpuMat<float>(gpuObservedDescriptors.Size.Height, k, 1, true)) using (GpuMat<Byte> gpuMask = new GpuMat<byte>(gpuMatchIndices.Size.Height, 1, 1)) using (Stream stream = new Stream()) { matcher.KnnMatchSingle(gpuObservedDescriptors, gpuModelDescriptors, gpuMatchIndices, gpuMatchDist, k, null, stream); indices = new Matrix<int>(gpuMatchIndices.Size); mask = new Matrix<byte>(gpuMask.Size); //gpu implementation of voteForUniquess using (GpuMat<float> col0 = gpuMatchDist.Col(0)) using (GpuMat<float> col1 = gpuMatchDist.Col(1)) { GpuInvoke.Multiply(col1, new MCvScalar(uniquenessThreshold), col1, stream); GpuInvoke.Compare(col0, col1, gpuMask, CMP_TYPE.CV_CMP_LE, stream); } observedKeyPoints = new VectorOfKeyPoint(); surfGPU.DownloadKeypoints(gpuObservedKeyPoints, observedKeyPoints); //wait for the stream to complete its tasks //We can perform some other CPU intesive stuffs here while we are waiting for the stream to complete. stream.WaitForCompletion(); gpuMask.Download(mask); gpuMatchIndices.Download(indices); if (GpuInvoke.CountNonZero(gpuMask) >= 4) { int nonZeroCount = Features2DToolbox.VoteForSizeAndOrientation(modelKeyPoints, observedKeyPoints, indices, mask, 1.5, 20); if (nonZeroCount >= 4) homography = Features2DToolbox.GetHomographyMatrixFromMatchedFeatures(modelKeyPoints, observedKeyPoints, indices, mask, 2); } watch.Stop(); } } } else #endif { //extract features from the object image modelKeyPoints = new VectorOfKeyPoint(); Matrix<float> modelDescriptors = surfCPU.DetectAndCompute(modelImage, null, modelKeyPoints); watch = Stopwatch.StartNew(); // extract features from the observed image observedKeyPoints = new VectorOfKeyPoint(); Matrix<float> observedDescriptors = surfCPU.DetectAndCompute(observedImage, null, observedKeyPoints); BruteForceMatcher<float> matcher = new BruteForceMatcher<float>(DistanceType.L2); matcher.Add(modelDescriptors); indices = new Matrix<int>(observedDescriptors.Rows, k); using (Matrix<float> dist = new Matrix<float>(observedDescriptors.Rows, k)) { matcher.KnnMatch(observedDescriptors, indices, dist, k, null); mask = new Matrix<byte>(dist.Rows, 1); mask.SetValue(255); Features2DToolbox.VoteForUniqueness(dist, uniquenessThreshold, mask); } int nonZeroCount = CvInvoke.cvCountNonZero(mask); if (nonZeroCount >= 4) { nonZeroCount = Features2DToolbox.VoteForSizeAndOrientation(modelKeyPoints, observedKeyPoints, indices, mask, 1.5, 20); if (nonZeroCount >= 4) homography = Features2DToolbox.GetHomographyMatrixFromMatchedFeatures(modelKeyPoints, observedKeyPoints, indices, mask, 2); } watch.Stop(); } matchTime = watch.ElapsedMilliseconds; }
static void Run(string[] args, bool verboseShow) { // Dependency Injection to reuse all stuff developed so far IKernel kernel = new StandardKernel(); DependencyInjection(kernel); // service initializatons var _albumInstanceDetailSvc = kernel.Get <IAlbumInstanceDetailService>(); var _albumInstanceSvc = kernel.Get <IAlbumInstanceService>(); var _memberSvc = kernel.Get <IMemberService>(); //class variable intializations string MatchFolderPath, MatchFile; bool processCatch; IEnumerable <UserAlbumInstanceDetail> batchPhotos = _albumInstanceDetailSvc.GetPhotosForBatchProcssing(); Console.WriteLine("About to process {0} records", batchPhotos.Count().ToString()); if (batchPhotos.Count() > 0) { if (verboseShow) { Console.WriteLine("Total records retrieved for processing : {0}", batchPhotos.Count().ToString()); } foreach (UserAlbumInstanceDetail batchPhoto in batchPhotos) { processCatch = false; long ticks = DateTime.Now.Ticks; if (verboseShow) { Console.WriteLine("Ticks-{0} : Processig record AlbumInstanceKey : {1}, MmeberKey : {2}, FaceToFind : {3}....", ticks.ToString(), batchPhoto.UserAlbumInstanceKey, batchPhoto.MemberKey, batchPhoto.FaceImage); } UserAlbumInstance photoImage = null; Member member = null; FindMatchResult findMatchResult = null; MatchFolderPath = MatchFile = ""; photoImage = _albumInstanceSvc.FindAlbumInstance(batchPhoto.UserAlbumInstanceKey); member = _memberSvc.FindMember(batchPhoto.MemberKey); MatchInput matchInput = new MatchInput(); matchInput.FindInFile = new FileInfo(photoImage.AbsolutePath); matchInput.MatchFile = new FileInfo(member.AbsoultePath + batchPhoto.FaceImage); matchInput.WebFolderPath = photoImage.FolderPath + "MatchFiles"; if (verboseShow) { Console.WriteLine(JsonConvert.SerializeObject(matchInput, Formatting.Indented)); } try { findMatchResult = BruteForceMatcher.FindMatchInSource(matchInput); } catch (Exception e) { processCatch = true; Console.WriteLine("Error processing AlbumInstanceKey : {0}", batchPhoto.UserAlbumInstanceKey); Console.Error.WriteLine("Exception"); Console.Error.WriteLine(e.Message); if (e.InnerException != null) { Console.Error.WriteLine("Inner Exception"); Console.Error.WriteLine(e.InnerException.ToString()); } //fix to update error for individual record processing batchPhoto.ProcessedOn = (DateTime)SqlDateTime.MinValue; batchPhoto.Remarks = "Error Processing : " + e.Message; batchPhoto.Processed = true; _albumInstanceDetailSvc.Update(batchPhoto); //---------------------------------------------------- } finally { if (!processCatch) { if (findMatchResult != null) { if (findMatchResult.Matched) { batchPhoto.FaceMatchFile = findMatchResult.MatchedFaceFile; } batchPhoto.Inliers = findMatchResult.Inliers; batchPhoto.OpenCVMethod = findMatchResult.OpenCvMethod; batchPhoto.FaceFound = findMatchResult.Matched; batchPhoto.FolderPath = findMatchResult.FolderPath; batchPhoto.AbsolutePath = findMatchResult.AbsolutePath; batchPhoto.ProcessedOn = DateTime.Now; batchPhoto.Processed = true; _albumInstanceDetailSvc.Update(batchPhoto); if (verboseShow) { Console.WriteLine("Ticks-{0} : Processed successfully AlbumInstanceKey : {1}, MmeberKey : {2}, FaceToFind : {3}....", ticks.ToString(), batchPhoto.UserAlbumInstanceKey, batchPhoto.MemberKey, batchPhoto.FaceImage); } } } } } } }