2016-10-24 3 views
0

Я пытаюсь включить и выключить реле, основанное на обнаружении цвета в кадре с веб-камеры. Поскольку это нужно делать в режиме реального времени, я решил использовать numpy slicing. Проблема в том, что многозначный ВСЕГДА обнаруживает цвет, который я вводил, если я не полностью закрываю камеру, и я просто не понимаю, почему.Использование numpy.any для соответствия цвета в opencv дает странные результаты

Вот соответствующий фрагмент кода:

import numpy as np 
import cv2 
import video 

while True: 
      ret,frame = cam.read()   
      img = frame.copy() 
      sens = 20 
      b = 0 
      #roughly neon green 
      img1B = 20 
      img1G = 230 
      img1R = 50 
      if np.any(np.logical_and(img[:,:,0]>=img1B-sens, img[:,:,0]<=img1B+sens)): 
       b = True 
      else: 
       b = False 
      if np.any(np.logical_and(img[:,:,1]>=img1G-sens, img[:,:,1]<=img1G+sens)): 
       g = True 
      else: 
       g = False 
      if np.any(np.logical_and(img[:,:,2]>=img1R-sens, img[:,:,2]<=img1R+sens)): 
       r = True 
      else: 
       r = False      
      print b,g,r 

B, G, R не должен всегда быть верным, если кулачок не видит зеленый пиксель неон, так что я не уверен, что происходит.

ответ

1

Вам не нужно чрезмерно усложнять проблему, используя numpy операции трижды. Вы можете просто использовать cv2.inRange() и cv2.countNonZero(), чтобы выполнить свою работу. Вышеупомянутые этапы могут быть модулированы методом, который вы можете вызывать из цикла while для обработки каждого кадра веб-камеры.

import cv2 

def detect_color_blob(img_BGR, blob_color_BGR, tolerance, threshold): 
    blob_color_lower = [blob_color_BGR[0] - tolerance, blob_color_BGR[1] - tolerance, blob_color_BGR[2] - tolerance] 
    blob_color_upper = [blob_color_BGR[0] + tolerance, blob_color_BGR[1] + tolerance, blob_color_BGR[2] + tolerance] 

    # Get a Binary Mask, where 255 => blob color found and 0=> blob color NOT found 
    mask = cv2.inRange(img_BGR, blob_color_lower, blob_color_upper) 

    # Check if the detected number of pixels is greater than threshold. 
    return cv2.countNonZero(mask) > threshold 
+1

Этот метод работал отлично, спасибо. – Snesticle

Смежные вопросы