2017-01-27 63 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] ...

我試圖使用normalize方法的結果,但它總是給我0和1作爲最小值和最大值。

我一直在網上衝浪,我找不到我的代碼上的錯誤。是否有任何方法來標準化0和1之間的結果最小值和最大值?

+0

我不確定我是否理解。難道你不能應用一些算術和布爾邏輯的最小和最大來檢查你是否應該打破循環? –

+0

我想在結果低於或高於閾值時打破循環,但最小值和最大值不允許我這樣做。 – ReyLitch

+0

你是說你不知道邊界應該是什麼?出現錯誤時,你會期望min和max落在'(0..1)'之外嗎? –

回答

0

最後我找到了解決方案。在深入閱讀官方OpenCV文檔中的template matching article之後,我將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)