2014-10-29 2 views
1

Я использую OpenCV 3.0.0, чтобы найти изображение в другое изображение. Априори функция matchTemplate - это то, что мне нужно использовать, но, увидев результаты, я больше не уверен.Opencv matchTemplate не соответствует

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

Пример 1:

Основное изображение

Simple

Шаблон

Simple

Результат

Simple

Никаких претензий здесь. Соответствие идеально подходит в этом случае. Но теперь я заменить изображения для тех, я хочу использовать и ...

Основное изображение

Complex

Шаблон

Complex

Результат

enter image description here

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

Итак, на мой вопрос, зависит ли результат matchTemplate от того, сколько разных цветов/форм имеет основное изображение? Может ли SURF или SIFT помочь мне здесь? Вы, ребята, теперь какая-нибудь функция, которая поможет мне найти шаблон в другом изображении?

Спасибо заранее!

PS: Я не добавлял никакого кода, потому что я думаю, что это не проблема, так как первый пример хорошо работает.

+0

после загрузки изображений, я уверен, что размер вашего шаблона разукрупненные? Совпадение шаблонов не является инвариантом к масштабам! – Micka

ответ

7

Возможно, ваша проблема связана с тем, что соответствие шаблону не является инвариантом шкалы, размер вашего шаблона doestn соответствует размеру объектов.

Используя этот вход, и код я получаю этот выход:

входного изображения: шаблон

enter image description here

вход:

enter image description here

код: взятый в основном из OpenCV учебника : http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

int main() 
{ 
    cv::Mat input = cv::imread("../inputData/TemplateMatch.jpg"); 

    cv::Mat gray; 
    cv::cvtColor(input,gray,CV_BGR2GRAY); 

    cv::Mat templ = cv::imread("../inputData/Template2.jpg"); 

    cv::Mat img = input; 
    cv::Mat result; 
    /// Create the result matrix 
    int result_cols = img.cols - templ.cols + 1; 
    int result_rows = img.rows - templ.rows + 1; 

    result.create(result_cols, result_rows, CV_32FC1); 

    int match_method = CV_TM_SQDIFF; 

    /// Do the Matching and Normalize 
    matchTemplate(img, templ, result, match_method ); 
    normalize(result, result, 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; 

    minMaxLoc(result, &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 
    if(match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED) 
    { matchLoc = minLoc; } 
    else 
    { matchLoc = maxLoc; } 

    /// Show me what you got 
    cv::rectangle(input, matchLoc, cv::Point(matchLoc.x + templ.cols , matchLoc.y + templ.rows), cv::Scalar::all(0), 2, 8, 0); 
    cv::rectangle(result, matchLoc, cv::Point(matchLoc.x + templ.cols , matchLoc.y + templ.rows), cv::Scalar::all(0), 2, 8, 0); 


    cv::imshow("input", input); 
    cv::imshow("template", templ); 

    cv::imwrite("../outputData/TemplateMatch.jpg", input); 
    cv::waitKey(0); 
    return 0; 
} 

выход:

enter image description here

+1

Ооо, так вот в чем проблема. Большое спасибо Микке. Оцените это ^^ –

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