7

ソースイメージのどの位置に特定のサブイメージが表示されているかを調べたいとします(たとえば、ソースイメージ:http://i.pictr.com/6xg895m69q.png、サブイメージ:http://i.pictr.com/jdaz9zwzej.png)。私が知っている限り、OpenCVに「読み込み可能」にするために配列を変換する必要がありますが、これは私が試したものですが、何らかの理由で動作しません。ここに私のコードは、これまでのところです:cvMatchTemplateを使用したイメージのイメージ - しかしどうですか?

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 

私の目標は、結果の配列にサブ画像の座標を書くことである(配列の残りの部分は値0を維持する必要があります(私は私のコードは文句を言わない、これを作ることを知っています今まで)このエラーメッセージ、コードを実行するときに私が取得:。。

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

私はOpenCVのに新しいですし、本当にこのエラーメッセージをどうするのか分からない。誰でもアイデア/ポインタ何行うか?

答えて

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

ありがとうございました!!あなたのソリューションは素晴らしいです! – 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

非常にマイナーなコメント - 'cv2 import cv'から' cv.CV_TM_SQDIFF'定数を取得する代わりに、実際に 'cv2.TM_SQDIFF'で直接cv2で取得できます。 (これは何らかの理由でOpenCVのドキュメントには言及されていません)。 –

関連する問題