iphone opencv — соответствие шаблону

#iphone #xcode4 #opencv #computer-vision

#iPhone #xcode4 #opencv #компьютерное зрение

Вопрос:

я внедрил эту сборку OpenCV в свой проект iphone:

http://aptogo.co.uk/2011/09/opencv-framework-for-ios/

Он успешно собран, и я знаю, как захватить изображение с помощью моей камеры, перевести его в оттенки серого и отобразить на imageview.

Но то, что я хотел бы сделать, это сопоставление шаблона с изображением, которое я захватил (с помощью камеры), с шаблонным изображением.

У меня оба изображения в оттенках серого, но я просто не понимаю, как работает ‘matchTemplate’. Это то, что у меня есть на данный момент:

 cv::Mat grayFrame, grayImg, output;

// This is the template image which i store in a cv::Mat and
// after that i grayscale the image
UIImage *testImage = [UIImage imageNamed:@"qr.png"];
cv::Mat tempMat = [testImage CVMat];
cv::cvtColor(tempMat, grayImg, cv::COLOR_RGB2GRAY);


// Convert captured frame to grayscale
cv::cvtColor(_lastFrame, grayFrame, cv::COLOR_RGB2GRAY);

// Having trouble here...
cv::matchTemplate(grayFrame, grayImg, output, CV_TM_CCORR_NORMED);


// Display result
// This already works for both the captured image and the template image
camView.image = [UIImage imageWithCVMat:grayFrame];
  

Проблема с этим кодом в том, является ли эта строка:

cv::matchTemplate(grayFrame, grayImg, вывод, 1);

Я не уверен, правильно ли я это делаю. Потому что я не получаю результат обратно в ‘output’ типа «MinMax», чтобы получить позиции найденного соответствия… Я вообще передаю правильные переменные в функцию matchTemplate …??

В любом случае, может кто-нибудь, пожалуйста, сказать мне, что я делаю не так и как заставить это работать?

  • редактировать — Добавлен скриншот моей переменной ‘output’ введите описание изображения здесь

Спасибо за любую помощь!

Ответ №1:

Функция matchTemplate() возвращает матрицу, значения которой представляют вероятность совпадения для каждого пикселя исходного изображения. Он содержит данные с плавающей запятой и имеет тот же размер (ширина / высота, что и входные данные). Чтобы извлечь позицию наиболее вероятного соответствия, вы должны запустить функцию minMaxLoc() над результатом.

Комментарии:

1. Спасибо, я только что узнал об этом методе, прочитав эту тему: tech.groups. yahoo.com/group/OpenCV/message/77992 — Но я все еще не понимаю, как это дает мне местоположение, потому что это дает мне только MinValue и MaxValue -> minMaxLoc (output, amp; minVal, amp; maxVal); Есть идеи, как это вернуть??

2. аннулирует minMaxLoc (входной массив src, double* minVal, double* maxVal=0, Point* minLoc=0, Point * maxLoc=0, маска входного массива=noArray()). Он возвращает как значение, так и позицию. отправьте ссылку на две точки, и она установит для них желаемые значения.

3. Я думаю, что тогда моя сборка неправильная, потому что у меня нет такого метода, с помощью которого я мог бы передавать точки minLoc / maxLoc. i39.tinypic.com/4lniok.png — Какую библиотеку вы используете для iOS?

4. не волнуйтесь, есть несколько перегруженных методов, просто вызовите его с параметрами, описанными выше, и он найдет подходящий.

5. Вы правы. Это действительно указывает на перегруженный метод, как вы сказали. Итак, я отмечу ваш ответ как правильный, поскольку это так. Но я надеюсь, что вы сможете помочь мне с одной последней вещью. Потому что у меня есть структура передачи точки, но из-за этого она выдает мне ошибку: — нет известного преобразования из Point * (он же Point *) в Point * (он же Point_<int> *) — я попытался создать его следующим образом: — Point[] res1; — и — Point * res1; — и — Point res1; -.. Но все терпит неудачу. Есть идеи, что я делаю не так ..?? В любом случае спасибо за всю вашу помощь!