Я пытаюсь добавить способ хранения и поиска повторяющихся изображений в MongoDB через C#. У меня есть приложение, которое позволяет пользователям создавать изображения и сохранять их на моем веб-сайте. Я храню их в MongoDB и теперь хочу найти дубликаты, но из-за количества изображений не могу просто сверить новые с другими. Я хочу иметь несколько индексов и флагов, чтобы быстро находить возможные дубликаты, а затем полностью их проверять. Я использую библиотеку OpenCV, чтобы найти дескрипторы изображений и сохранить их, чтобы после этого я мог легко проверить их на новые. Что я могу использовать в качестве флагов или индекса, чтобы не выполнять поиск по всей базе данных? Есть ли быстрый способ? Это пример моего кода, который позволяет мне находить дескрипторы:
Код: Выделить всё
Mat img1 = Cv2.ImRead("somepic", ImreadModes.Grayscale);
var orb = ORB.Create();
KeyPoint[] keyPoints;
Mat descriptors = new Mat();
orb.DetectAndCompute(img1, null, out keyPoints, descriptors);
Приведен пример сравнения двух изображений по их дескрипторам (левое исходное и правое обрезанное). Так что этот метод работает. Но как это сделать быстро на миллионах картинок?
сравнивая изображения
Я слышал, что можно разделить дескрипторы на 4-8 частей и использовать их как индексы, но нет никакой гарантии, что я найду возможный дубликат. Я тоже слышал о k-средних, но тоже не понимаю, как его использовать с дескрипторами. А может есть другой способ без машинного обучения?
P.S. Я попробовал PHash, но он ужасен для обрезанных фотографий.
Подробнее здесь:
https://stackoverflow.com/questions/788 ... via-opencv