• Как узнать включает или нет изображение №1 объект с изображения №2 с помощью OpenCV?

    Zenker
    @Zenker
    Я правильно понимаю, что вы рассчитываете расстояния между дескрипторами и ищите наиболее похожие точки на образце и текущем изображении? Если так, то при таком подходе не учитывается взаимное расположение точек, поэтому едва ли можно судить о наличии объекта на изображении. Я сам с OpenCV знаком мало, поэтому постараюсь в общих чертах описать возможный способ решения:

    1) С помощью детекторов локальных особенностей (SIFT/SURF/ORB итд.) находите особые точки на образце и изображении

    2) Для найденных точек рассчитываете в их окрестностях значения дескрипторов. Дескриптор — это многомерный вектор(по сути набор чисел), характеризующий точку. Чем больше похожи два дескриптора(меньше расстояние между ними), тем более вероятно, что речь идет об одной и той же точке на образце и текущем изображении.

    3) Каждой особой точке на одном изображении сопоставляете точку с другого по минимальному расстоянию между дескрипторами(количество найденных точек на изображениях скорее всего будет разным, но одна и та же точка образца может быть наилучшим кандидатом для нескольких точек с изображения). Такое сопоставление будет скорее всего в большинстве своем не верно, поэтому нужно отфильтровать ложные соответствия.

    4) Самый важный этап. Ложные соответствия обычно хорошо фильтруются алгоритмом RANSAC. Суть тут вот в чем: алгоритм пытается по вышенайденным точкам найти преобразование, которое позволило бы наилучшим образом сопоставить два изображения. Если такое преобразование находится и достаточно большое количество точек подтверждает эту модель(такие точки называют инлайнами), то скорее всего объект на изображении присутствует.

    Конкретно в OpenCV есть функция FindHomography, только нужно с ней разобраться. Если я правильно понял, srcPoints и dstPoints — массивы особых точек на образце и изображении, где элементы с одинаковыми индексами — это и есть пары сопоставленных точек. Возвращает матрицу преобразования H, но как сигнализируется об успешности ее поиска — нужно разобраться. Возможно, нагуглить какую-нибудь другую реализацию. Я бы попробовал оценить результат по доле инлайнов в общем количестве точек.
    Поподробнее про RANSAC и подобную задачу в целом можно почитать тут: engineering.purdue.edu/kak/courses-i-teach/ECE661.08/solution/hw4_s1.pdf
    Ответ написан
    2 комментария