Успешность сопоставления с шаблоном с opencv

Как измерить успех алгоритма сопоставления с шаблоном opencv?

Я понимаю, что функцию minmaxLoc можно использовать для поиска местоположения наилучшего соответствия. Но дает ли это также представление о том, насколько удачным был матч? (Если да, как бы вы узнали?)

Существует ли еще более подходящая функция для измерения корреляции между найденным соответствием (зеленый прямоугольник) и исходным шаблоном? Например, что если шаблонное изображение слегка повернуто или переведено по сравнению с тем, которое можно найти в соответствующем изображении?

Я просто беру среднее по всем minmax-локациям или что бы вы предложили?

пример функции сопоставления с шаблоном в opencv

cv::Mat cv_in_image = [in_image CVMat];
cv::Mat cv_in_template = [in_template CVMat];
cv::Mat output;

// Do some OpenCV stuff with the image

/// Create the result matrix
int result_cols = in_image.size.width - in_template.size.width + 1;
int result_rows = in_image.size.height - in_template.size.height + 1;

output.create(result_rows, result_cols, CV_32FC1);

cv::matchTemplate(cv_in_image, cv_in_template, output, cv::TM_CCORR_NORMED);

cv::normalize(output, output, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

/// Localizing the best match with minMaxLoc
double minVal; double maxVal;
cv::Point minLoc; cv::Point maxLoc;
cv::Point matchLoc;

cv::minMaxLoc(output, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat());

/// For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
int match_method;
if(match_method  == cv::TM_SQDIFF || match_method == cv::TM_SQDIFF_NORMED) {
    matchLoc = minLoc;
    NSLog(@"Correlation minVal = %f", minVal);
    NSLog(@"(Correlation maxVal = %f)", maxVal);
}
else {
    matchLoc = maxLoc;
    NSLog(@"Correlation maxVal = %f", maxVal);
    NSLog(@"(Correlation minVal = %f)", minVal);
}

/// Show me what you got

cv::Rect rect1;
rect1.x = matchLoc.x;
rect1.y = matchLoc.y;
rect1.width = cv_in_template.cols;
rect1.height = cv_in_template.rows;

cv::rectangle(cv_in_image, rect1, cv::Scalar::all(0), 2, 8, 0);

1 ответ

Решение

Вы можете попробовать использовать некоторые метрики сходства, такие как PSNR или SSIM.

Еще одна ссылка.

Другие вопросы по тегам