2017-01-27 3 views
0

Я пытаюсь сделать соответствие шаблона на картинке, чтобы найти все совпадения. Чтобы сделать это, я хочу использовать пороговое значение от 0 до 1, чтобы иметь возможность остановить процесс. Я использую следующий код:Ruby OpenCv Соответствие шаблону

require 'opencv' 
include OpenCV 

template_filename = (ARGV.size == 2) ? ARGV[0] : File.expand_path(File.dirname(__FILE__) + '/lena-eyes.jpg') 
match_image_filename = (ARGV.size == 2) ? ARGV[1] : File.expand_path(File.dirname(__FILE__) + '/lena-256x256.jpg') 

template = CvMat.load(template_filename) 
match_image = CvMat.load(match_image_filename) 

10.times.each do |t| 
    result = match_image.match_template(template, :sqdiff_normed) 
    #result = result.normalize(0, 1, CV_NORM_MINMAX, -1, nil) 

    pt1 = result.min_max_loc[2] 
    pt2 = CvPoint.new(pt1.x + template.width, pt1.y + template.height) 
    match_image.rectangle!(pt1, pt2, :color => CvColor::Black, :thickness => 3) 
end 

window = GUI::Window.new('Display window') 
window.show(match_image) 

Проблема заключается в том, что минимальное и максимальное значения, которые я получаю с match_template не между 0 и 1, так что я не в состоянии использовать порог. Первый результат имеет следующие минимальные и максимальные значения: [0.00011, 0.4955]. Другие результаты, которые являются недопустимыми, имеют следующие минимальные и максимальные значения: [0.1190, 0.5369], [0.1296, 0.5369] ...

Я попытался использовать метод нормализации с результатом, но он всегда дает мне 0 и 1 как минимальные и максимальные значения.

Я занимаюсь серфингом в Интернете, и я не могу найти ошибку в своем коде. Есть ли способ нормализовать минимальное и максимальное значения результата между 0 и 1?

+0

Я не уверен, что понимаю. Не могли бы вы применить некоторую арифметическую и логическую логику с min и max, чтобы проверить, следует ли вам разорвать цикл? –

+0

Я хочу разбить цикл, когда результат ниже или выше порога, но значения min и max не позволяют мне это делать. – ReyLitch

+0

Вы имеете в виду, что вы не знаете, какие границы должны быть? Вы ожидали бы, что min и max упадут за пределы '(0..1)', если что-то пойдет не так? –

ответ

0

Наконец-то я нашел решение. После глубокого чтения template matching article в официальной документации OpenCV я преобразовал match_image в оттенки серого, и я изменил метод сопоставления шаблонов для использования метода CCOEFF_NORMED. С помощью этого метода точка совпадения задается max loc (result.min_max_loc [3]).

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

require 'opencv' 
include OpenCV 

template_filename = (ARGV.size == 2) ? ARGV[0] : File.expand_path(File.dirname(__FILE__) + '/lena-eyes.jpg') 
match_image_filename = (ARGV.size == 2) ? ARGV[1] : File.expand_path(File.dirname(__FILE__) + '/lena-256x256.jpg') 

template = CvMat.load(template_filename) 
match_image = CvMat.load(match_image_filename) 
match_image.BGR2GRAY 

10.times.each do |t| 
    result = match_image.match_template(template, :ccoeff_normed) 
    pt1 = result.min_max_loc[3] 
    pt2 = CvPoint.new(pt1.x + template.width, pt1.y + template.height) 
    match_image.rectangle!(pt1, pt2, :color => CvColor::Black, :thickness => 3) 
end 

window = GUI::Window.new('Display window') 
window.show(match_image)