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