Я делаю приложение iOS, которое найдет экземпляры меньшего (похожего) изображения внутри большего изображения. Например, что-то вроде:Улучшение точности совпадения изображений с помощью OpenCV matchTemplate
изображения, которое мы ищем внутри
Образа мы ищем
Согласованные изображения
Основные вещи, чтобы рассмотреть, то 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
это изображение, которое мы ищем в пределах bigImagetolerance
- допуск для совпадений (от 0 до 1)
Это действительно работает, но есть несколько проблем.
Первоначально я попытался использовать полное изображение объекта изображения, которое я пытаюсь сопоставить (т. Е. Изображение всего холодильника), но я обнаружил, что это было очень неточно, когда допуск был высоким, он ничего не нашел, и когда он был низким, он нашел много неправильных совпадений.
Далее я проверил, используя меньшие части изображения, например:
Это повысило точность определения цели в большом изображении, но и приводит много неправильных соответствий в Что ж.
Я перепробовал все доступные методы для matchTemplate
от here, и все они возвращают большое количество ложных совпадений, за исключением CV_TM_CCOEFF_NORMED
, который возвращает меньше матчей (но также в основном ложные матчи)
Как можно улучшить точность сопоставления изображений с использованием OpenCV в iOS?
Edit: Я гугле нагрузки, наиболее полезные посты:
- Pattern Matching - Find reference object in second image
- Measure of accuracy in pattern recognition using SURF in OpenCV
- Template Matching
- Algorithm improvement for Coca-Cola can shape recognition
Невозможно найти какие-либо рекомендации по улучшению точности.
Вы прочитали [этот вопрос] (https://stackoverflow.com/questions/10168686/algorithm-improvement-for-coca-cola-can-shape-recognition) и его ответы? Проблема кажется близкой к вашей. – AldurDisciple
@AldurDisciple У меня есть ответ, рекомендующий использовать сопоставление функций вместо соответствия шаблону, которое я пробовал, и насколько я понимаю, лучше всего подходит для случаев, когда совпадающее изображение вращается/перекошено/масштабировано. Моя реализация соответствия функций работала, но давала огромное количество ложных совпадений, и недостаточно правильных совпадений, чтобы иметь возможность уверенно идентифицировать согласованное изображение. –
будет объект, который вы ищете, должен быть повернут на изображении? – Bharat