【问题标题】:Ruby OpenCv Template matching thresholdRuby OpenCv 模板匹配阈值
【发布时间】:2017-01-31 20:40:07
【问题描述】:

我正在尝试在图片上进行模板匹配以找到所有匹配项。为此,我想使用 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 之间?

【问题讨论】:

  • 我不确定我是否理解。难道你不能应用一些算术和布尔逻辑与 min 和 max 来检查你是否应该打破循环?
  • 我想在结果低于或高于阈值但最小值和最大值不允许我这样做时打破循环。
  • 你的意思是你不知道界限应该是什么?当出现问题时,您会期望 min 和 max 超出 (0..1) 吗?
  • 不完全是。我希望最小值或最大值在正确匹配时等于/相似于 0,而在匹配不正确时将等于/相似于另一个更高的值(小于 1)。然而,糟糕的匹配总是具有介于 0.11 和 0.15 之间的混合值和介于 0.53 和 0.55 之间的最大值。

标签: ruby opencv template-matching


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多