我有兩個面,一個大Python的OpenCV的:使用matchTemplate
我試圖將它們視爲灰度圖像,以適應template matching tutorial這些表面。
我需要更新教程以在x和y中獨立縮放,我已經完成了這個工作,但添加了一個額外的循環。我的代碼是:
import pandas as pd
import numpy as np
import cv2
import matplotlib.pyplot as plt
import matplotlib.patches as patches
# If True shows each iteration of the template matching
Visualise = True
# Load in image and template
image = pd.read_excel('TemplateMatching_exampleData.xlsx',sheetname="radial_template").as_matrix().astype(np.float32)
template = pd.read_excel('TemplateMatching_exampleData.xlsx',sheetname="radial_image").as_matrix().T.astype(np.float32)
# Save a raw copy of the template
template_raw = template
# Rescale the template to approximate the same range in values as the image
template = template - np.mean(template)
template = (template/np.max(template)) * np.max(image)
# Get the height and width of the template
(tH, tW) = template.shape[:2]
# initialize the bookkeeping variable to keep track of the matched region
found = None
# If visualise = True then initialise the figure to show the iteration
if Visualise:
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
# loop over the scales of the image
for scale_width in np.linspace(0.1, 2, 20):
for scale_height in np.linspace(0.1, 3, 20)[::-1]:
# resize the image according to the scale, and keep track
# of the ratio of the resizing
resized = cv2.resize(image, (int(image.shape[0] * scale_height), int(image.shape[1] * scale_width)))
r_h = image.shape[0]/float(resized.shape[0])
r_w = image.shape[1]/float(resized.shape[1])
# if the resized image is smaller than the template, then break
# from the loop
if resized.shape[0] < tH or resized.shape[1] < tW:
break
# apply template matching to find the template in the image
result = cv2.matchTemplate(resized, template, cv2.TM_CCOEFF)
(_, maxVal, _, maxLoc) = cv2.minMaxLoc(result)
# check to see if the iteration should be visualized
if Visualise:
ax1.clear()
ax1.imshow(resized)
ax1.add_patch(patches.Rectangle((maxLoc[0], maxLoc[1]), tW, tH, fill=False, edgecolor = 'red'))
plt.show()
plt.draw()
plt.pause(0.05) # fig1.waitforbuttonpress()
# if we have found a new maximum correlation value, then update
# the bookkeeping variable
if found is None or maxVal > found[0]:
found = (maxVal, maxLoc, r_w, r_h, scale_width, scale_height)
# unpack the bookkeeping varaible and compute the (x, y) coordinates
# of the bounding box based on the resized ratio
(_, maxLoc, r_w, r_h, scale_width, scale_height) = found
(startX, startY) = (int(maxLoc[0] * r_w), int(maxLoc[1] * r_h))
(endX, endY) = (int((maxLoc[0] + tW) * r_w), int((maxLoc[1] + tH) * r_h))
# draw a bounding box around the detected result and display the image
figure = plt.figure()
ax1 = figure.add_subplot(111)
ax1.imshow(image)
ax1.add_patch(patches.Rectangle((startX,startY), endX-startX, endY-startY, fill=False, edgecolor = 'red'))
plt.show()
plt.draw()
# show the matching image segment and template together
plt.figure()
plt.subplot(121)
plt.imshow(image[startX:endX, startY:endY])
plt.title('Image')
plt.subplot(122)
plt.imshow(template)
plt.title('Template')
但是什麼我發現的是,「最佳組合」是在最大scale_width
值總是發現,不管是什麼我將該值設置爲是,但我想不通爲什麼。我猜這是衡量體質如何的結果,但我對cv2.matchTemplate
瞭解不多,因此我一直在苦苦思索這幾天。
請你能幫我解決我的代碼嗎?
我已將我的數據從我的Excel文件複製到this GoogleDocs document。
1.它可能會更好用標準差(簡單地'numpy.std(陣列)')不僅僅是由最大規模來劃分;通過std dev移動均值和潛水給你一個0均值和單位標準dev的分佈。 2.您應該縮放模板和圖像以獲得相似的分佈。 3.您可以共享Excel數據在公共谷歌片或類似的,或縮放的灰階值恰好浮子0 UINT8 0和1之間或之間和255,並將它們保存爲OpenCV的'imwrite()'和公佈這些灰度圖像爲我們加載。 –
謝謝,我在主帖中添加了數據鏈接 – jlt199
查看電子表格中的值,您是否實際縮放了'image'或僅僅是'template'?因爲由'max'被劃分後,你的模板將有'1',而你的'image'有像一個最大值'10000',所以你不會得到任何接近的比賽的最大值。請嘗試按比例兩者,無論是與標準方差就像我提到的,甚至只是天真地轉移/他們兩個大規模進入0和1,看看你是否得到比賽的方式。因爲否則,只要關閉該教程並擴展您的模板應該會相對較好。 –