Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby OpenCv模板匹配阈值_Ruby_Opencv_Template Matching - Fatal编程技术网

Ruby OpenCv模板匹配阈值

Ruby OpenCv模板匹配阈值,ruby,opencv,template-matching,Ruby,Opencv,Template Matching,我试图在图片上进行模板匹配,以便找到所有匹配项。要做到这一点,我想使用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

我试图在图片上进行模板匹配,以便找到所有匹配项。要做到这一点,我想使用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_模板获得的最小值和最大值不在0和1之间,因此我无法使用阈值。第一个结果具有以下最小值和最大值:[0.00011,0.4955]。其他无效结果的最小值和最大值如下:[0.1190,0.5369],[0.1296,0.5369]

我曾尝试对结果使用规格化方法,但它总是给我0和1作为最小值和最大值


我一直在网上冲浪,在我的代码上找不到错误。有没有办法使结果的最小值和最大值在0和1之间正常化?

最后我找到了解决方案。在深入阅读官方OpenCV文档后,我将match_图像转换为灰度,并更改了模板匹配方法,以使用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)

我终于找到了解决办法。在深入阅读官方OpenCV文档后,我将match_图像转换为灰度,并更改了模板匹配方法,以使用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)
?不完全是这样。我希望最小值或最大值在正确匹配时等于/类似于0,而在不匹配时则等于/类似于另一个更高的值(小于1)。然而,糟糕的匹配总是混合值在0.11和0.15之间,最大值在0.53和0.55之间。我不确定我是否理解。你不能用一些算术和布尔逻辑来检查你是否应该中断循环吗?我想在结果低于或高于阈值时中断循环,但最小值和最大值的值不允许我这样做。你的意思是你不知道边界应该是什么?当出现问题时,您会期望最小值和最大值超出
(0..1)
?不完全是这样。我希望最小值或最大值在正确匹配时等于/类似于0,而在不匹配时则等于/类似于另一个更高的值(小于1)。但是,不好的匹配总是混合值在0.11和0.15之间,最大值在0.53和0.55之间。