将matchTemplate与彩色图像OpenCV一起使用

时间:2019-04-24 11:24:26

标签: python opencv colors matchtemplate

我正在尝试检测桌面屏幕截图中的某些彩色图像,其中我使用的模板形状相同但颜色不同(使用灰度图像时,使用正常的matchTemplate方法无法区分它们),这是主要的检测代码:

     template = cv2.imread(template_path,1)
    #template_hsv = cv2.cvtColor(template, cv2.COLOR_RGB2HSV)
    #template_B, template_G, template_R = cv2.split(template)
    #scr_B, scr_G, scr_R = cv2.split(screenshot)
    scr_B = screenshot[:, :, 0]
    scr_G = screenshot[:, :, 1]
    scr_R = screenshot[:, :, 2]
    template_B = template[:, :, 0]
    template_G = template[:, :, 1]
    template_R = template[:, :, 2]
    #cv2.imwrite('./sc4.png', scr_R)
    #cv2.imwrite('./template.png', template)

    resB = cv2.matchTemplate(scr_B, template_B, cv2.TM_CCOEFF_NORMED)
    resG = cv2.matchTemplate(scr_G, template_G, cv2.TM_CCOEFF_NORMED)
    resR = cv2.matchTemplate(scr_R, template_R, cv2.TM_CCOEFF_NORMED)

    res = resB + resG + resR

    #res = cv2.matchTemplate(screenshot, template_G, cv2.TM_CCOEFF_NORMED)
    matches = np.where(res >= 3*threshold)
    print(matches)
    return matches

如您所见,我尝试拆分rgb屏幕截图图像的通道,然后与也拆分的模板图像进行比较。如您在注释代码中所见,我还尝试使用HSV频道进行此操作。 但是,这没有用,尽管看到了单通道图像中存在视觉上的颜色差异,但程序没有将它们区分开(我还尝试与模板和屏幕快照的每个通道进行比较)。

所有建议都值得欢迎,甚至尝试使用其他方法来实现我的目标。先感谢您。

1 个答案:

答案 0 :(得分:1)

我用TM_CCOEFF_NORMED方法尝试了一下,但是没有用...以某种方式将所有结果都设为1.0(所有最大值)。

让我们先创建一个示例图像,如下所示:

TM_SQDIFF_NORMED

这将创建2张图像,import numpy as np import cv2 randVal = lambda : np.random.randint(0,high=255, dtype=np.uint8) randomColor = lambda : (randVal(), randVal(), randVal()) targetColor = randomColor() width = 500 height = 500 x = 20 y = 20 img = np.zeros((height, width,3), dtype=np.uint8) target = np.full((100, 100,3), targetColor, dtype=np.uint8) while y < height-100: x = 20 while x < width-100: img[y:y+100, x:x+100] = randomColor() x += 120 y += 120 img[20:120, 20:120] = targetColor img都是随机的,在我的测试中,它给出了以下内容:

img:

enter image description here

目标:

enter image description here

现在,我按原样使用模板匹配,因为在文档中说它可能占用1或3个通道,并且可以正确地使用其他方法

target

这给了我以下结果:

enter image description here

我希望这对您有帮助...我需要测试您在其他版本中使用的方法,以查看这是否是我的版本中存在的问题或这组图像是否有特定的问题...