2017-01-27 2 views
0

Ich versuche, Vorlage Matching auf einem Bild zu machen, um alle Übereinstimmungen zu finden. Um dies zu erreichen, möchte ich einen Schwellenwert zwischen 0 und 1 verwenden, um den Prozess zu stoppen. Ich verwende den folgenden Code ein:Ruby OpenCv Template entspricht Schwellenwert

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) 

Das Problem ist, dass die minimalen und maximalen Werte, die ich mit dem match_template erhalten nicht zwischen 0 und 1, also bin ich nicht in der Lage, die Schwelle zu verwenden. Das erste Ergebnis hat folgende Min- und Max-Werte: [0.00011, 0.4955]. Die anderen Ergebnisse, die ungültig sind, haben die folgenden Min- und Max-Werte: [0.1190, 0.5369], [0.1296, 0.5369] ...

Ich habe versucht, die Normalize-Methode mit dem Ergebnis zu verwenden, aber es gibt mir immer 0 und 1 als Min- und Max-Werte.

Ich habe im Internet surfen und ich kann den Fehler auf meinem Code nicht finden. Gibt es eine Möglichkeit, die Min- und Max-Werte des Ergebnisses zwischen 0 und 1 zu normalisieren?

+0

Ich bin mir nicht sicher, ob ich das verstehe. Könnten Sie nicht einige arithmetische und boolesche Logik mit Min und Max anwenden, um zu prüfen, ob Sie die Schleife unterbrechen sollten? –

+0

Ich möchte die Schleife unterbrechen, wenn ein Ergebnis niedriger oder höher als ein Schwellenwert ist, aber die Werte von Min- und Max-Werten erlauben es mir nicht, dies zu tun. – ReyLitch

+0

Sie meinen, dass Sie nicht wissen, was die Grenzen sein sollten? Sie würden erwarten, dass min und max außerhalb von (0..1) fallen, wenn etwas schief geht? –

Antwort

0

Endlich habe ich die Lösung gefunden. Nachdem ich die template matching article in der offiziellen OpenCV-Dokumentation tief gelesen habe, habe ich match_image in Graustufen umgewandelt und die Template-Matching-Methode für die Verwendung der CCOEFF_NORMED-Methode geändert. Bei dieser Methode wird der Punkt der Übereinstimmung durch die max loc (result.min_max_loc [3]) angegeben.

Jetzt ist der maximale Wert fast gleich 1, wenn es eine genaue Übereinstimmung ist, und es sinkt, wenn die Übereinstimmung ähnlich aber nicht gleich ist.

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)