7

Ich möchte herausfinden, an welcher Position eines Quellbildes ein bestimmtes Teilbild erscheint (z. B. Quellbild: http://i.pictr.com/6xg895m69q.png, Teilbild: http://i.pictr.com/jdaz9zwzej.png). Soweit ich weiß, ist es notwendig, die Arrays zu transformieren, um sie für OpenCV "lesbar" zu machen, das ist es was ich versuchte, aber aus irgendeinem Grund funktioniert es nicht. hier ist mein Code so weit:Bild in Bild mit cvMatchTemplate - aber wie?

from PIL import Image 
import numpy 
from pylab import * 
import cv2 
import cv 

image = cv2.imread('source_img.jpg') 
template = cv2.imread('template_img.jpg') 

im = cv.fromarray(image) 
templ = cv.fromarray(template) 
result = numpy.zeros(shape=(1,10)) ##create a matrix with 0s 
a = cv.fromarray(result) 
cv.MatchTemplate(im, templ, a, cv.CV_TM_CCORR) 
print result 
print image 

mein Ziel ist es, die Koordinaten der Teilbilder im Ergebnisfeld (der Rest des Feldes schreiben soll den Wert hält 0 (Ich weiß, dass mein Code wird nicht das machen . Meldung bislang) dieser Fehler, erhalte ich, wenn der Code ausgeführt wird.

OpenCV Error: Assertion failed (result.size() == cv::Size(std::abs(img.cols - templ.cols) + 1, std::abs(img.rows - templ.rows) + 1) && result.type() == CV_32F) in cvMatchTemplate, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.3/modules/imgproc/src/templmatch.cpp, line 376 Traceback (most recent call last): File "/Users/strongbow/imagerecognition.py", line 27, in cv.MatchTemplate(im, templ, a, cv.CV_TM_CCORR) cv2.error: result.size() == cv::Size(std::abs(img.cols - templ.cols) + 1, std::abs(img.rows - templ.rows) + 1) && result.type() == CV_32F

ich bin neu in OpenCV und wirklich nicht wissen, was mit dieser Fehlermeldung zu tun jemand eine Idee/Zeiger was zu tun?

Antwort

8
import sys 
import cv2 
import numpy 

img = cv2.imread(sys.argv[1]) 
template = cv2.imread(sys.argv[2]) 
th, tw = template.shape[:2] 

result = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED) 
threshold = 0.99 
loc = numpy.where(result >= threshold) 
for pt in zip(*loc[::-1]): 
    cv2.rectangle(img, pt, (pt[0] + tw, pt[1] + th), 0, 2) 

cv2.imwrite(sys.argv[3], img) 

enter image description here

+0

danken Ihnen soviel !! Ihre Lösung funktioniert großartig! – julianschnell

5
import cv2 
from cv2 import cv 

image = cv2.imread('1_tree.jpg') 
template = cv2.imread('1_tree_detail.jpg') 

values = cv2.matchTemplate(image, template, method=cv.CV_TM_SQDIFF) 
best_fit_point = cv2.minMaxLoc(values)[2] 
bottom_right = best_fit_point[0]+template.shape[0], best_fit_point[1]+template.shape[1] 
cv2.rectangle(image, best_fit_point, bottom_right, (255,255,255)) 
cv2.imshow('tree',image) 
cv2.imwrite('tree_match.jpg', image) 
cv2.waitKey() 

enter image description here enter image description here enter image description here

+2

Sehr kleiner Kommentar - anstatt '' von cv2 import cv' hinzuzufügen, um die Konstante 'cv.CV_TM_SQDIFF' zu erhalten, können Sie es eigentlich nur in cv2 direkt mit' cv2.TM_SQDIFF' erhalten. (Dies wird in den OpenCV-Dokumenten aus irgendeinem Grund nicht erwähnt.) –