Paft 0 Жалоба Опубликовано March 12, 2012 Здравствуйте! Пользуюсь FeatureDetector, DescriptorExtractor для определения особенностей изображений. Сопоставляю особенности при помощи BruteForceMatcher, но не могу определить адекватность полученных результатов - требуется выражение схожести в форме процента. Пример программы: Mat image1 = imread("C:\\1.png", 1); Mat image2 = imread("C:\\2.png", 1); vector<KeyPoint> keypoints1; vector<KeyPoint> keypoints2; FastFeatureDetector detector(10); detector.detect(image1, keypoints1); detector.detect(image2, keypoints2); cv::Mat descriptors1; cv::Mat descriptors2; BriefDescriptorExtractor descriptorExtractor; descriptorExtractor.compute(image1, keypoints1, descriptors1); descriptorExtractor.compute(image2, keypoints2, descriptors2); BruteForceMatcher<HammingLUT> matcher; std::vector<cv::DMatch> matches; matcher.match(descriptors1, descriptors2, matches); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано March 12, 2012 ну вы определите критерий схожести. ваш код просто находит пары точек. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Paft 0 Жалоба Опубликовано March 12, 2012 Что вы подразумеваете под критерием схожести? В том то и проблема, что пары точек я нашел, а определить принадлежат ли они одному и тому же объекту (например кружке), изображенному на разных рисунках (может быть с небольшим поворотом и масшабом) не знаю как. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 12, 2012 Можно применить преобразование гомографии, и сравнить картинки корреляцией. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Paft 0 Жалоба Опубликовано March 12, 2012 Простите за непонятливость, но не могли бы вы простенький примерчик дать? Я примерно представляю как рассчитать гомографию, но что такое корелляция ума не приложу :-) И нужны ли будут данные картинок для сравнения? Необходимо, чтобы картинки в сравнении не участвовали, только описательные данные (по аналогии сравнения по хэшу - т.е. я полагал, что можно будет заранее рассчитать дескрипторы BRIEF и хранить их в базе для последующего сравнения). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 12, 2012 примерно то же что и Template Matching посмотреть можно здесь: http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Paft 0 Жалоба Опубликовано March 13, 2012 Идею понял, но проблема как раз в том, что для сравнения понадобятся оба изображения, а этого необходимо избежать из соображений производительности. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано March 13, 2012 какую задачу вы пытаетесь решить? если кружка одна и та же на нескольких снимках, то кол-во хороших пар точек и будет критерием схожести. можно добавить доп критерий, чтобы отношения между точками были те же самые (расстояния между точками одни и те же или учитывая еще афинные преобразования будет более сложный) если кружки разные, а имеют только лишь похожу форму,т.е. надо определить класс объектов, то почитать публикации отсюда http://pascallin.ecs.soton.ac.uk/challenges/VOC/ вообще как то люди делают CBIR системы и на дескрипторах особых точек, но мой опыт опыт использования из opencv показывает, что эти детекторы ищут только тот же самый предмет ,возможно я делаю что то не так. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Paft 0 Жалоба Опубликовано March 13, 2012 Объект один и тот же везде (но может быть под разным углом/сжат/растянут). Но как выделить именно хорошие точки из найденного массива? Если бы это получилось более-менее адекватно сделать, то можно было бы и выразить в виде процента отношение числа "хороших" точен к общему числу. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано March 13, 2012 точка описывается дескриптором, можно считать пару точек хорошей ,если дескрипторы похожи по какой либо метрике до определенного порога, можно дополнительно учитывать расстояние между точками в каждом наборе точек(но это становится сложно, если есть афинные искажения), можно дополнительно отсеивать ouliner'ы и оставлять inliner'ы с помощью ransac. еще про классы. вот еще на всякий случай статья там вместо дескрипторов используются маленькие патчи. http://habrahabr.ru/blogs/image_processing/129685/ +расширенная лекция на английском там есть и про дескрипторы с особыми точками http://summerschool2011.graphicon.ru/files/lectures/mscvs2011_lepetit.pdf и еще тут в оcновном про cbir, но есть еще и про сопоставление точек кое чего. http://courses.graphicon.ru/files/courses/vision/2011/lectures/cv2011_10_cbir.pdf Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах