希望在OpenCV python中加速模板匹配吗
我使用下面的代码来检测屏幕上的多个图像,使用多个源图像来检测屏幕上的不同对象。 在解决方案中发现了这一点,但当应用时,我的fps急剧下降希望在OpenCV python中加速模板匹配吗,python,opencv,Python,Opencv,我使用下面的代码来检测屏幕上的多个图像,使用多个源图像来检测屏幕上的不同对象。 在解决方案中发现了这一点,但当应用时,我的fps急剧下降 import cv2 as cv import numpy as np import os from time import time import mss os.chdir(os.path.dirname(os.path.abspath(__file__))) imgs = ['car.png', 'bear.png', 'computer.png',
import cv2 as cv
import numpy as np
import os
from time import time
import mss
os.chdir(os.path.dirname(os.path.abspath(__file__)))
imgs = ['car.png', 'bear.png', 'computer.png', 'log.png', 'utensils.png',
'bench.png', 'river.png', 'keepdistance.png', 'waste.png', 'player.png']
def findClickPostion(needle_img_path, haystack_img):
# haystack_img = cv.imread('/Users/amanrai/Desktop/conquer2020/main.png', cv.IMREAD_UNCHANGED)
needle_img = cv.imread(needle_img_path, cv.IMREAD_UNCHANGED)
result = cv.matchTemplate(haystack_img, needle_img, cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
threshold = 0.8
if max_val >= threshold:
needle_w = needle_img.shape[1]
needle_h = needle_img.shape[0]
top_left = max_loc
bottom_left = (top_left[0] + needle_w, top_left[1] + needle_h)
print('Found')
cv.rectangle(haystack_img, top_left, bottom_left, color=(
0, 255, 0), thickness=2, lineType=cv.LINE_4)
cv.imshow('result', haystack_img)
# cv.waitKey()
else:
print('Not Found')
loop_time = time()
with mss.mss() as sct:
monitor = {"top": 450, "left": 0, "width": 1438,
"height": 450} # "width": 1500, "height": 860
while (True):
screenshot = np.array(sct.grab(monitor))
#screenshot = cv.cvtColor(screenshot, cv.COLOR_RGB2BGR)
#cv.imshow('Computer Vision', screenshot)
for ik in imgs:
findClickPostion(ik, screenshot)
print('FPS {}'.format(1 / (time() - loop_time)))
loop_time = time()
if cv.waitKey(1) == ord('q'):
cv.destroyAllWindows()
break
print('done')
我想要实现的是加速这个过程,这样它可以在不丢失任何fps的情况下检测屏幕上的多个对象。
我在没有GPU的情况下使用它。您在这里所做的(考虑到您没有使用GPU来提高速度)是在Python实例的单个线程中工作的,速度很慢
要在不使用GPU的情况下加快速度,您需要并行化匹配。因此,您可以同时匹配多个模板。虽然Python中的multi很棘手,但是可以加快速度。拥有多线程处理器将大有帮助。您可以拥有对工作实例的控制权
除了多线程之外,我可以看到您正在读取每个循环中磁盘上的所有图像。这是非常昂贵的。因此,这里的优化是在开始时将模板图像加载到内存中,并在每次循环中使用它们
此外,您还应该测量注释中提到的@MarkSetchell使用时间最多的地方
<>编辑:也可以考虑使用GPU来完成这些工作。它们可以轻松地提高数据处理的性能和满意度。使用KAZE、SIFT代替模板匹配,它们更快、更可靠。模板匹配是最基本的方法。加速任何代码的第一部分是测量当前使用的时间。试着测量你的图像采集的时间,处理和显示的各个阶段。用GPU做它将加速,在C++上做加速会使<代码> imc> <代码>调用函数的外部。阅读这些图片一次,而不是每次迭代。阅读每次迭代的图片应该是第一件要提到的事情。这很可能占去了大部分时间。从过程到精细分辨率,使用金字塔处理。在高分辨率的每一步中,只需围绕前一分辨率中找到的匹配处理一个roi