Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
希望在OpenCV python中加速模板匹配吗_Python_Opencv - Fatal编程技术网

希望在OpenCV python中加速模板匹配吗

希望在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',

我使用下面的代码来检测屏幕上的多个图像,使用多个源图像来检测屏幕上的不同对象。 在解决方案中发现了这一点,但当应用时,我的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', '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