2014-09-07 4 views
2

Я делаю приложение iOS, которое найдет экземпляры меньшего (похожего) изображения внутри большего изображения. Например, что-то вроде:Улучшение точности совпадения изображений с помощью OpenCV matchTemplate

The image we are searching inside изображения, которое мы ищем внутри

enter image description here

Образа мы ищем

enter image description here

Согласованные изображения

Основные вещи, чтобы рассмотреть, то smallImage размер будет соответствовать размеру цели в bigImage, но объект может быть немного затемняется в bigImage (как они не всегда будут одинаковыми). Кроме того, изображения, с которыми я имею дело, немного меньше моих примеров, изображение, которое я пытаюсь сопоставить (smallImage), находится между 32 x 32 пикселями и 80 x 80 пикселями, а большое изображение размером около 1000 x 600 пиксели. В отличие от потенциально слабо затененного, smallImage будет соответствовать объекту в большом изображении во всех отношениях (размер, цвет, поворот и т. Д.)

Я опробовал несколько методов с использованием OpenCV. Совпадение функций не показалось достаточно точным и дало мне сотни бессмысленных результатов, поэтому я пытаюсь сопоставить шаблоны. Мой код выглядит примерно так:

cv::Mat ref = [bigImage CVMat]; 
cv::Mat tpl = [smallImage CVMat]; 
cv::Mat gref, gtpl; 
cv::cvtColor(ref, gref, CV_LOAD_IMAGE_COLOR); 
cv::cvtColor(tpl, gtpl, CV_LOAD_IMAGE_COLOR); 
cv::Mat res(ref.rows-tpl.rows+1, ref.cols-tpl.cols+1, CV_32FC1); 
cv::matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED); 
cv::threshold(res, res, [tolerance doubleValue], 1., CV_THRESH_TOZERO); 


    double minval, maxval, threshold = [tolerance doubleValue]; 
    cv::Point minloc, maxloc; 
    cv::minMaxLoc(res, &minval, &maxval, &minloc, &maxloc); 

    if (maxval >= threshold) { 
     // match 
  • bigImage является большое изображение, в котором мы tryign найти цель

  • smallImage это изображение, которое мы ищем в пределах bigImage

  • tolerance - допуск для совпадений (от 0 до 1)

Это действительно работает, но есть несколько проблем.

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

Далее я проверил, используя меньшие части изображения, например:

enter image description here

Это повысило точность определения цели в большом изображении, но и приводит много неправильных соответствий в Что ж.

Я перепробовал все доступные методы для matchTemplate от here, и все они возвращают большое количество ложных совпадений, за исключением CV_TM_CCOEFF_NORMED, который возвращает меньше матчей (но также в основном ложные матчи)

Как можно улучшить точность сопоставления изображений с использованием OpenCV в iOS?

Edit: Я гугле нагрузки, наиболее полезные посты:

Невозможно найти какие-либо рекомендации по улучшению точности.

+2

Вы прочитали [этот вопрос] (https://stackoverflow.com/questions/10168686/algorithm-improvement-for-coca-cola-can-shape-recognition) и его ответы? Проблема кажется близкой к вашей. – AldurDisciple

+0

@AldurDisciple У меня есть ответ, рекомендующий использовать сопоставление функций вместо соответствия шаблону, которое я пробовал, и насколько я понимаю, лучше всего подходит для случаев, когда совпадающее изображение вращается/перекошено/масштабировано. Моя реализация соответствия функций работала, но давала огромное количество ложных совпадений, и недостаточно правильных совпадений, чтобы иметь возможность уверенно идентифицировать согласованное изображение. –

+1

будет объект, который вы ищете, должен быть повернут на изображении? – Bharat

ответ

3

Если изображение шаблона не поворачивается (или под некоторым проективным искажением) в изображении, в котором вы ищете, поскольку все геометрические и текстурные свойства сохраняются (при условии, что окклюзия не очень велика), единственной переменной слева является масштаб. Следовательно, выполнение алгоритма соответствия шаблонов в нескольких масштабах исходного шаблона, а затем принятие максимального нормированного ответа по всем шкалам должно дать идеальное соответствие. Одна из проблем может заключаться в том, что для идеального соответствия угадание (оптимизация) точного масштаба будет дорогостоящим с точки зрения вычислительной техники или связано с некоторыми эвристиками. Одна эвристика может быть выполнена, сопоставлять шаблоны в 3 разных масштабах (1, 2, 4), предположим, что вы получите лучший ответ в определенном масштабе (скажем 2), попробуйте между (1.5, 2.25, 3) и продолжайте рафинирование. Конечно, это эвристика, которая может хорошо работать на практике, но не является теоретически правильным способом поиска правильной шкалы и может застрять в локальных минимумах.

Причина, по которой основанные на элементах методы не будут работать над этим видом изображения, заключается в том, что они полагаются на текстурные/резкие градиенты, которые не очень очевидны в изображении однородного шаблона, которое вы показали.

+0

Спасибо за ответ. Изображение шаблона - это точный размер, который отображается в изображении для поиска. + 1 по той причине, что совпадение функций не работает, я решил, что сопоставление функций было больше для «органических» изображений, таких как фотографии. –

+0

Запуск через вариацию весов оказался для меня работой, спасибо. – AgnosticDev

Смежные вопросы