Example #1
0
      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);

          }
      }
Example #2
0
        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);
        }
Example #3
0
      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;
      }
Example #4
0
        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);
                                }
                            }
                        }
                    }
                }
            }
        }