Ruby OpenCv模板匹配阈值
Ruby OpenCv Template matching threshold
我正在尝试对图片进行模板匹配以找到所有匹配项。为此,我想使用 0 到 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)
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 之间?
终于找到解决办法了。在深入阅读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)
我正在尝试对图片进行模板匹配以找到所有匹配项。为此,我想使用 0 到 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)
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 之间?
终于找到解决办法了。在深入阅读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)