2013-01-23 26 views
7

मैं यह जानना चाहता हूं कि किसी स्रोत-छवि की स्थिति एक निश्चित उप-छवि दिखाई देती है (उदा। स्रोत छवि: http://i.pictr.com/6xg895m69q.png, उप-छवि: http://i.pictr.com/jdaz9zwzej.png)। जहां तक ​​मुझे पता है कि उन्हें ओपनसीवी में "पठनीय" बनाने के लिए सरणी को बदलने के लिए जरूरी है, मैंने यही कोशिश की, लेकिन किसी कारण से, यह काम नहीं करता है। (मैं जानता हूँ किछवि में छवि 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

निरंतर 'cv.CV_TM_SQDIFF' प्राप्त करने के लिए' cv2 आयात cv' से 'जोड़ने के बजाय, आप वास्तव में इसे केवल cv2 में' cv2.TM_SQDIFF' के साथ प्राप्त कर सकते हैं। (किसी कारण से ओपनसीवी दस्तावेज़ों में इसका उल्लेख नहीं है।) –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^