问题

我正在尝试在桌面屏幕截图中检测某些彩色图像,其中我有同样形状的模板,但不同的颜色(这些不是彼此区别,做正常的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通道执行此操作,如您在注释代码中所看到的那样. 但是这不起作用,尽管在单个信道图像中看到颜色的视觉差异,但程序没有区分它们(我也尝试与模板和屏幕截图的每个通道进行比较).

欢迎所有的糖拥有,甚至尝试使用其他任何东西来实现我的目标.提前感谢您.

  最佳答案

我用TM_CCOEFF_NORMED方法尝试了它,并且不起作用....不知何故,它给出了一切1.0(所有最大值)...但是使用TM_SQDIFF_NORMED方法实际上给出了一些合理的东西.

让我们从创建示例图像开始,我这样做如下:

 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
 

这将创建2个图像,imgtarget,它们都是随机的,在我的测试中它给出了这样的东西:

IMG:

enter image description here

目标:

enter image description here

现在,我使用了模板匹配,因为在文档中说它可能需要1或3个通道,它将正确执行,但另一种方法

 res = cv2.matchTemplate(img[:,:,0], target[:,:,0], cv2.TM_SQDIFF_NORMED )
threshold = 0.00001
loc = np.where( res <= threshold )
img_rgb = img.copy()
for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + 100, pt[1] + 100), (0,0,255), 2)
 

这给了我以下结果:

enter image description here

我希望这有帮助...我需要测试您在另一个版本中使用的方法,以查看它是否是我的版本中的问题或者这组图像的特定内容...

  相同标签的其他问题

pythonopencvcolorsmatchtemplate