public void IndexFiles(FileInfo[] imageFiles, System.ComponentModel.BackgroundWorker IndexBgWorker, Action<string> logWriter, SurfSettings surfSetting = null) { #region Surf Dectator Region double hessianThresh = 500; double uniquenessThreshold = 0.8; if (surfSetting != null) { hessianThresh = surfSetting.HessianThresh.Value; uniquenessThreshold = surfSetting.UniquenessThreshold.Value; } SURFDetector surfDectector = new SURFDetector(hessianThresh, false); #endregion int rows = 0; Matrix<float> superMatrix = null; List<SURFRecord1> observerSurfImageIndexList = new List<SURFRecord1>(); Stopwatch sw1, sw2; sw1 = Stopwatch.StartNew(); logWriter("Index started..."); int totalFileCount = imageFiles.Length; for (int i = 0; i < totalFileCount; i++) { var fi = imageFiles[i]; using (Image<Gray, byte> observerImage = new Image<Gray, byte>(fi.FullName)) { VectorOfKeyPoint observerKeyPoints = new VectorOfKeyPoint(); Matrix<float> observerDescriptor = surfDectector.DetectAndCompute(observerImage, null, observerKeyPoints); if (observerDescriptor.Rows > 4) { int initRow = rows; int endRows = rows + observerDescriptor.Rows - 1; SURFRecord1 record = new SURFRecord1 { Id = i, ImageName = fi.Name, ImagePath = fi.FullName, IndexStart = rows, IndexEnd = endRows }; observerSurfImageIndexList.Add(record); if (superMatrix == null) superMatrix = observerDescriptor; else superMatrix = superMatrix.ConcateVertical(observerDescriptor); rows = endRows + 1; } else { Debug.WriteLine(fi.Name + " skip from index, because it didn't have significant feature"); } } IndexBgWorker.ReportProgress(i); } sw1.Stop(); logWriter(string.Format("Index Complete, it tooked {0} ms. Saving Repository...", sw1.ElapsedMilliseconds)); SurfDataSet surfDataset = new SurfDataSet { SurfImageIndexRecord = observerSurfImageIndexList, SuperMatrix = superMatrix }; sw2 = Stopwatch.StartNew(); SurfRepository.AddSuperMatrixList(surfDataset); SurfRepository.SaveRepository(SurfAlgo.Flaan); sw2.Stop(); logWriter(string.Format("Index tooked {0} ms. Saving Repository tooked {1} ms", sw1.ElapsedMilliseconds, sw2.ElapsedMilliseconds)); }
public void IndexFiles(FileInfo[] imageFiles, System.ComponentModel.BackgroundWorker IndexBgWorker, Action<string> logWriter, SurfSettings surfSetting = null) { //For Time Profilling long readingTime, indexingTime, saveingTime; #region Surf Dectator Region double hessianThresh = 500; double uniquenessThreshold = 0.8; if (surfSetting != null) { hessianThresh = surfSetting.HessianThresh.Value; uniquenessThreshold = surfSetting.UniquenessThreshold.Value; } float hessianThreshold2 = (float)hessianThresh / 1000000; SpeededUpRobustFeaturesDetector surf = new SpeededUpRobustFeaturesDetector(hessianThreshold2); #endregion int rows = 0; List<SURFRecord1> observerSurfImageIndexList = new List<SURFRecord1>(); List<SpeededUpRobustFeaturePoint> listOfAllObserverImagesSurfPoints = new List<SpeededUpRobustFeaturePoint>(); Stopwatch sw1; sw1 = Stopwatch.StartNew(); logWriter("Index started..."); int totalFileCount = imageFiles.Length; for (int i = 0; i < totalFileCount; i++) { var fi = imageFiles[i]; using (Bitmap observerImage = (Bitmap)Image.FromFile(fi.FullName)) { List<SpeededUpRobustFeaturePoint> observerImageSurfPoints = surf.ProcessImage(observerImage); if (observerImageSurfPoints.Count > 4) { int initRow = rows; int endRows = rows + observerImageSurfPoints.Count - 1; SURFRecord1 record = new SURFRecord1 { Id = i, ImageName = fi.Name, ImagePath = fi.FullName, IndexStart = rows, IndexEnd = endRows }; observerSurfImageIndexList.Add(record); listOfAllObserverImagesSurfPoints.AddRange(observerImageSurfPoints); rows = endRows + 1; } else { Debug.WriteLine(fi.Name + " skip from index, because it didn't have significant feature"); } } IndexBgWorker.ReportProgress(i); } sw1.Stop(); readingTime = sw1.ElapsedMilliseconds; logWriter(string.Format("Reading Surb Complete, it tooked {0} ms. Saving Repository...", readingTime)); //------------Initialize Tree from Data sw1.Reset(); sw1.Start(); double[][] superMatrix = listOfAllObserverImagesSurfPoints.Select(c => c.Descriptor).ToArray(); int[] outputs = new int[superMatrix.Length]; for (int i = 0; i < outputs.Length; i++) outputs[i] = i; Accord.MachineLearning.Structures.KDTree<int> tree = Accord.MachineLearning.Structures.KDTree.FromData(superMatrix, outputs, Accord.Math.Distance.Euclidean, inPlace: true); sw1.Stop(); indexingTime = sw1.ElapsedMilliseconds; logWriter(string.Format("Intializing KD Tree: {0}", indexingTime)); //--------------Saving Indexed Records sw1.Reset(); sw1.Start(); SurfAccordDataSet surfAccordDataset = new SurfAccordDataSet { SurfImageIndexRecord = observerSurfImageIndexList, IndexedTree = tree }; string repoFileStoragePath = Path.Combine(DirectoryHelper.SaveDirectoryPath, "SurfAccordDataSet.bin"); if (File.Exists(repoFileStoragePath)) File.Delete(repoFileStoragePath); using (FileStream s = File.Create(repoFileStoragePath)) { //Polenter.Serialization.SharpSerializerBinarySettings bs = // new Polenter.Serialization.SharpSerializerBinarySettings(Polenter.Serialization.BinarySerializationMode.SizeOptimized); //Polenter.Serialization.SharpSerializer formatter = new Polenter.Serialization.SharpSerializer(bs); //formatter.Serialize(surfAccordDataset, s); System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); formatter.Serialize(s, surfAccordDataset); s.Close(); } sw1.Stop(); saveingTime = sw1.ElapsedMilliseconds; logWriter(string.Format("Saving Surf Accord Dataset: {0}", saveingTime)); //Invalidating Cache CacheHelper.Remove("SurfAccordDataSet"); CacheHelper.Remove("SurfAccordIntervalTree"); logWriter(string.Format("Reading: {0} ms, Indexing: {1} ms, Saving Indexed data {2}", readingTime, indexingTime, saveingTime)); }