2015-08-10 2 views
0

Я использую OpenCV (opencv_java248). У меня есть одно изображение шаблона. У этого шаблона изображение есть логотип какой-то компании. Я хочу знать, содержит ли этот логотип другое изображение. Я где-то получил код.Совместимость шаблона в openCV [JAVA]

public void run(String inFile, String templateFile, String outFile, 
     int match_method) { 
    System.out.println("Running Template Matching"); 

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

    ///Create the result matrix 
    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); 

    ///Do the Matching and Normalize 
    Imgproc.matchTemplate(img, templ, result, match_method); 
    // Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new 
    // Mat()); 
    Imgproc.threshold(result, result, 0.5, 1.0, Imgproc.THRESH_TOZERO); 
    ///Localizing the best match with minMaxLoc 
    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; 
    } 
    double threashhold = 0.40; 
    if (mmr.maxVal > threashhold) { 
     Core.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(), 
       matchLoc.y + templ.rows()), new Scalar(0, 255, 0)); 
    } 
    // Save the visualized detection. 
    Highgui.imwrite(outFile, img); 
} 

Он отлично работает, когда шаблон и целевой образ имеют одинаковый масштаб. Мой вопрос: как я могу сделать это неуместным? My search image Target Image and logo Template

ответ

2

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

Я не знаю Java API, но недавно просмотрел нечто подобное, написанное на C++. Преобразование должно быть довольно простым, поскольку процесс будет таким же на любом языке.

Во-первых, выполните шаблон, как обычно, прочитайте на своих изображениях и создайте коврик, чтобы сохранить результат.

cv::Mat drawing = cv::imread(_drawing); //Read drawing 
cv::Mat tmp = cv::imread(_tmp); //Read template 
cv::Mat res(drawing.rows - tmp.rows + 1, drawing.cols - tmp.cols + 1, CV_32FC1); //Create result matrix 

//Perform template matching, normalise results 0 -> 1 
cv::matchTemplate(tmp, drawing, res, CV_TM_CCOEFF_NORMED); 
cv::threshold(res, res, 0.8, 1.0, CV_THRESH_TOZERO); //Can thresh to filter results if needed 

Теперь, когда результат заселена, создавать переменные для удержания мин/макс оценки и их местоположения в результате матрицы.

Значение допуска используется для фильтрации приемлемых результатов, где 1.0 можно рассматривать как 100% -ное совпадение и 0,25 как 25%.

//min/max values and acceptable tolerance 
double min, max, tolerance = 0.90; 
cv::Point minloc, maxloc; //min/max value locations 

Теперь извлечь значения из результата и проверить максимальное значение от вашей терпимости, если это в пределах допуска его спичку.

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

//Loop through all results 
while (true){ 

    //Pull out min/max values from results matrix 
    cv::minMaxLoc(res, &min, &max, &minloc, &maxloc); 

    //Is max within tolerance 
    if (max >= tolerance){ 

     //Yes - Match found, do stuff // 

     //Blank out that result in matrix so next highest can be extracted 
     cv::floodFill(res, maxloc, cv::Scalar(0), 0, cv::Scalar(0.1), cv::Scalar(1.0)); 

    } 
    else 
     break; //No more results within tolerance, break search 
} 

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

Edit - Template Matching & Scale

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

Уточнение соответствия шаблонов для инвариантности шкалы - не самая простая задача, простой метод, который вы могли бы попробовать - создать масштабированные варианты шаблона (посмотрите на пирамиды изображения OpenCVs).

Существует также множество документов, в которых представлены более продвинутые варианты сопоставления шаблонов, если они заинтересованы (поиск Google принесет больше всего).

Возможно, вы захотите изучить feature detection, который является инвариантным к масштабу и вращению.

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

+1

Я добавил немного дополнительного ответа на вопрос о масштабной инвариантности – user3510227

+0

Это действительно полезно.Я добавил изображение для поиска и логотип в отредактированном вопросе. Вы предлагаете обнаружение функции, но можете указать конкретный алгоритм. который я должен использовать coz, насколько известно, есть число algo. и некоторые из них запатентованы. Мое очень основное требование состоит в том, что они должны быть свободными, и они должны возвращать некоторый уровень уверенности в сопоставлении (т. Е. При сопоставлении шаблонов, я получаю MinMaxLocResult.maxval). –

+0

В OpenCV SIFT/SURF - это два запатентованных метода, остальные (насколько мне известно) доступны для использования, есть много попробовать [см. Здесь] (http://docs.opencv.org/modules/features2d/ doc/feature_detection_and_description.html), FAST может быть хорошей отправной точкой. Но от взгляда на ваш логотип может быть проще: треугольники являются единственной желтой формой на документе. Вы могли бы просто искать желтые пиксели, и если их достаточно, и они относительно близки друг к другу (база по размеру изображения), у вас есть совпадение. – user3510227