如何使用cvMatchTemplate实现图中图?
我想知道在一张源图像中,某个子图像出现的位置(比如源图像:http://i.pictr.com/6xg895m69q.png,子图像:http://i.pictr.com/jdaz9zwzej.png)。据我所知,需要对数组进行转换,以便让OpenCV能够“理解”,这是我尝试过的,但不知为何,它没有成功。以下是我目前的代码:
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错误:断言失败(result.size() == cv::Size(std::abs(img.cols - templ.cols) + 1, std::abs(img.rows - templ.rows) + 1) && result.type() == CV_32F)在cvMatchTemplate,文件 /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,第376行 回溯(最近的调用最后): 文件 "/Users/strongbow/imagerecognition.py",第27行,在 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还很陌生,真的不知道该如何处理这个错误信息。有没有人能给我一些建议或提示?
2 个回答
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()
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)