Не удается определить контур не более одного цвета - PullRequest
0 голосов
/ 01 июля 2019

Я делаю распознавание жестов, используя определение цвета, используя opencv и python.У меня проблема в том, что контуры обнаруживаются только для одного цвета, например красного, но два других цвета не обнаруживаются, например зеленый или синий, поэтому некоторые мои жесты не работают.

В моем коде только красныйЦветовые контуры обнаруживаются, а не синие

Код:

 import cv2
 import numpy as np
 from pynput.mouse import Button, Controller
 import wx
 import time
 import pyautogui

 mouse = Controller()
 app = wx.App(False)
 (sx, sy) = wx.GetDisplaySize()(camx, camy) = (320, 240)
##green
 lowerBoundG = np.array ([65, 66, 77])
 upperBoundG = np.array ([96, 255, 255])
##red
 lowerBoundR = np.array ([134, 94, 98])
 upperBoundR = np.array ([179, 255, 255])
##blue
 lowerBoundB = np.array ([88, 78, 20])
 upperBoundB = np.array ([128, 255, 255])
 cam = cv2.VideoCapture (0)
 cam.set (3, camx)
 cam.set (4, camy)
 kernelOpen = np.ones ((5, 5))
 kernelClose = np.ones ((20, 20))
 mLocOld = np.array ([0, 0])
 mouseLoc = np.array ([0, 0]) DampingFactor = 3 while True
:
 ret, uf = cam.read()
 img = cv2.flip (uf, 1)
#convert BGR to HSV
 imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#create the Mask
  maskG = cv2.inRange (imgHSV, lowerBoundG, upperBoundG)
  maskR = cv2.inRange (imgHSV, lowerBoundR, upperBoundR)
  maskB = cv2.inRange (imgHSV, lowerBoundR, upperBoundB)
#morphology
  maskOpenG = cv2.morphologyEx(maskG, cv2.MORPH_OPEN, kernelOpen)
  maskCloseG = cv2.morphologyEx(maskOpenG, cv2.MORPH_CLOSE, kernelClose)
  maskOpenR = cv2.morphologyEx(maskR, cv2.MORPH_OPEN, kernelOpen)
  maskCloseR = cv2.morphologyEx(maskOpenR, cv2.MORPH_CLOSE, kernelClose)
  maskOpenB = cv2.morphologyEx(maskB, cv2.MORPH_OPEN, kernelOpen)
  maskCloseB = cv2.morphologyEx(maskOpenB, cv2.MORPH_CLOSE, kernelClose)
  maskFinalG = maskCloseG
  maskFinalR = maskCloseR
  maskFinalB = maskCloseB
  contsG, h = cv2.findContours(maskFinalG.copy(), cv2.RETR_EXTERNAL,
             cv2.CHAIN_APPROX_NONE) 
  contsR, v = cv2.findContours (maskFinalR.copy (), cv2.RETR_EXTERNAL,
             cv2.CHAIN_APPROX_NONE) 
  contsB, p = cv2.findContours (maskFinalB.copy (), cv2.RETR_EXTERNAL,
             cv2.CHAIN_APPROX_NONE)
##for COntrolling mouse cursor
  if (len (contsR) == 1):
     x, y, w, h = cv2.boundingRect(contsR[0])
     cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2)
     cx = int (x + w / 2)
     cy = int (y + h / 2)
     div = int (w + h / 4)
     cv2.circle (img, (cx, cy), div, (0, 0, 255), 2)
     mouseLoc = mLocOld + ((cx, cy) - mLocOld) / DampingFactor
     mouse.position = (mouseLoc[0] * sx / camx, mouseLoc[1] * sy / camy)
     mLocOld = mouseLoc
##For Mouse right click
  elif (len (contsR) == 1 and len (contsB) == 1):
     mouse.click (Button.right, 1) time.sleep (1) cv2.imshow ("cam", img)
     ##cv2.imshow("mask",maskClose)
 cv2.waitKey (5)

1 Ответ

2 голосов
/ 01 июля 2019

Ваш код говорит:

##for COntrolling mouse cursor
 if (len (contsR) == 1):
 # [.....]
##For Mouse right click
  elif (len (contsR) == 1 and len (contsB) == 1):

Если красный имеет какое-либо значение, elif никогда не будет достигнуто, потому что if выполняется.

Вместо этого сначала попробуйте случай с дополнительными условиями:

##For Mouse right click
 if (len (contsR) == 1 and len (contsB) == 1):
 # [.....]
##for COntrolling mouse cursor
  elif (len (contsR) == 1):

Итак, если есть красный и синий, сделайте щелчок мышью. Если синего нет, но красный, переместите курсор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...