public string FindBestMatchFromScopeOfImages(ImageModel imageObject, IList <ImageModel> imageScenes) { IList <DMatch> bestMatches = new List <DMatch>(); string imagePath = string.Empty; var descriptorObject = ConvertOpenCVTypes.ConvertFloatArrayToMat(imageObject.Descriptor); Parallel.ForEach(imageScenes, (imageScene) => { var descriptorScene = ConvertOpenCVTypes.ConvertFloatArrayToMat(imageScene.Descriptor); var knnMatches = _matcher.KnnMatch(descriptorObject, descriptorScene, 2).ToList(); const float ratioThresh = 0.7f; List <DMatch> goodMatches = new List <DMatch>(); for (int i = 0; i < knnMatches.Count; i++) { if (knnMatches[i][0].Distance < ratioThresh * knnMatches[i][1].Distance) { goodMatches.Add(knnMatches[i][0]); } } lock (_lockObjectCalculating) { if (goodMatches.Count > 100 && goodMatches.Count > bestMatches.Count) { bestMatches = goodMatches; imagePath = imageScene.ImagePath; } } }); return(imagePath); }
public DMatch[] Match(float[,] descriptorImage) { var descriptor = ConvertOpenCVTypes.ConvertFloatArrayToMat(descriptorImage); if (!_matcher.Empty()) { _matcher.Train(); } return(_matcher.Match(descriptor)); }
public void AddImagesToTrain(IList <ImageModel> models) { var descriptionsScene = models.Select(x => { _indexIdMapImage.Add(_index, x.Id); _index++; return(ConvertOpenCVTypes.ConvertFloatArrayToMat(x.Descriptor)); }); _matcher.Add(descriptionsScene); }
public ImageModel ConvertImagePathToImageModel(string imagePath) { Mat imgObject = Cv2.ImRead(imagePath, ImreadModes.Grayscale); Mat descriptorsObject = new Mat(); double minHessian = 400; SURF detector = SURF.Create(minHessian, extended: false); var keypointsObject = detector.Detect(imgObject).Take(1000).ToArray(); detector.Compute(imgObject, ref keypointsObject, descriptorsObject); var imageModel = new ImageModel() { ImagePath = imagePath, ImageHash = ImageHelper.GetImageHash(imagePath), Descriptor = ConvertOpenCVTypes.ConvertMatToFloatArray(descriptorsObject) }; return(imageModel); }