2015-08-21 4 views
0

В следующем коде соответствия шаблона я не понимаю, что следующая строка делает:OpenCV параметры согласования шаблона

cv::Mat res(ref.rows-tpl.rows+1, ref.cols-tpl.cols+1, CV_32FC1); 

Полный код:

#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

int main() 
{ 
    cv::Mat ref = cv::imread("ref.jpg"); 
    cv::Mat tpl = cv::imread("temp.jpg"); 
    if (ref.empty() || tpl.empty()) 
     return -1; 

    cv::Mat gref, gtpl; 
    cv::cvtColor(ref, gref, CV_BGR2GRAY); 
    cv::cvtColor(tpl, gtpl, CV_BGR2GRAY); 

    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, 0.8, 1., CV_THRESH_TOZERO); 

    while (true) 
    { 
     double minval, maxval, threshold = 0.8; 
     cv::Point minloc, maxloc; 
     cv::minMaxLoc(res, &minval, &maxval, &minloc, &maxloc); 

     if (maxval >= threshold) 
     { 
      cv::rectangle(
       ref, 
       maxloc, 
       cv::Point(maxloc.x + tpl.cols, maxloc.y + tpl.rows), 
       CV_RGB(0, 255, 0), 2 
       ); 
      cv::floodFill(res, maxloc, cv::Scalar(0), 
       0, cv::Scalar(.1), cv::Scalar(1.)); 
     } 
     else 
      break; 
    } 

    cv::imshow("reference", ref); 
    cv::waitKey(); 
    return 0; 
} 

ответ

1

Это создает матрицу, которая будет содержат результат сопоставления.

Согласно документации matchTemplate

  • результат - Карта результатов сравнения. Он должен быть одноканальным 32-битным с плавающей запятой. Если изображение W x H и шаблон w x h, тогда результат равен (W-w + 1) x (H-h + 1).

Со ссылкой на ваш код:

image -> ref 
template -> tpl 
W  -> ref.cols 
H  -> ref.rows 
w  -> tpl.cols 
h  -> tpl.rows 

single-channel 32-bit floating-point -> CV_32FC1 

Однако, поскольку matchTemplate создаст получившееся изображение, вам не нужно создавать. Вы можете просто:

... 
cv::Mat res; 
cv::matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED); 
... 
+0

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

+0

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

+0

Спасибо за ответ. Я понял, что это результат, как граница, которая укажет регион в исходном изображении, который соответствует шаблону – sarmad

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