2014-02-02 6 views
0

Я новичок в opencv.opencv - matchTemplate

У меня есть фрагмент кода, который соответствует совпадению с моим шаблоном.

public static void findTemplete(String inFile, String templateFile, String outFile, int match_method) { 
    System.out.println("\nRunning Template Matching"); 

    Mat img = Highgui.imread(inFile); 
    Mat templ = Highgui.imread(templateFile); 

    int result_cols = img.cols() - templ.cols() + 1; 
    int result_rows = img.rows() - templ.rows() + 1; 
    Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1); 

    Imgproc.matchTemplate(img, templ, result, match_method); 
    Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat()); 

    MinMaxLocResult mmr = Core.minMaxLoc(result); 

    Point matchLoc; 
    if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) { 
     matchLoc = mmr.minLoc; 
    } else { 
     matchLoc = mmr.maxLoc; 
    } 

    Core.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(), 
      matchLoc.y + templ.rows()), new Scalar(0, 255, 0)); 

    System.out.println("Writing "+ outFile); 
    Highgui.imwrite(outFile, img); 

} 

Моя проблема в том, что matchTemplate находит «лучший матч». Так что, если мой храм не существует вообще на картинке, он что-то находит.

Так как я могу установить «Сила соответствия», так что будут найдены только сильные совпадения.

+0

возможно взглянуть на это: http://stackoverflow.com/questions/17762846/matchtemplate-with-opencv-in-java – Micka

ответ

1

Удалите нормализацию после вашего шаблона соответствия. Это не позволит minmaxloc дать вам правильные номера.

Вот пример:

double minVal; double maxVal=0; Point minLoc; Point maxLoc; 
     Point matchLoc; 
     matchTemplate (frame, objectToFind, result, CV_TM_CCORR_NORMED); 
     minMaxLoc (result, &minVal, &maxVal, &minLoc, &maxLoc, Mat ()); 


     matchLoc = maxLoc; 


     if (maxVal > .995) 
{ 
     //we have a good match so do something 
      } 

0,995 является то, что вы меняете на другой номер, чтобы помочь удалить плохие матчи.

Поскольку мы произвольно установить этот номер, есть его выходное текущее значение в вашей консоли, используя что-то вроде:

printf("My current maxVal: %f \n", maxVal); 

Это поможет вам оценить то, что вы должны установить значение.

Надеется, что это помогает :)

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