2016-04-14 2 views
1

Я написал код, который обнаруживает светло-розовый цвет. Теперь я хочу добавить код, который автоматически закроет веб-камеру после обнаружения светло-розового цвета. Можете ли вы помочь мне с этим? Вот EDITED код:Остановить веб-камеру после обнаружения определенного цвета

import cv2 
import numpy as np 

cap = cv2.VideoCapture(0) 

while(1): 
    _, frame = cap.read() 

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

    lower_pink = np.array([160,50,50]) 
    upper_pink = np.array([180,255,255]) 

    mask = cv2.inRange(hsv, lower_pink, upper_pink) 

    # Bitwise-AND mask and original image 
    res = cv2.bitwise_and(frame,frame, mask= mask) 
    cv2.imshow('frame',frame) 
    cv2.imshow('mask',mask) 
    cv2.imshow('res',res) 
    break 

if(cv2.countNonZero(mask) > 0): 
    print("FOUND") 
    raise SystemExit 

cv2.destroyAllWindows() 
+0

Вы можете выйти, когда ваша маска говорит, что вы нашли розовый цвет (то есть хотя бы некоторое количество пикселей в маске не равно нулю). Что-то вроде; 'if (cv2.countNonZero (mask)> threshold): break' – Miki

+0

Я новичок в обработке изображений и все это. Так можете ли вы добавить, какое пороговое значение я должен написать? Потому что, когда я положил его на ноль и запустил код. Окно (hsv, mask, res) просто закрывается в миллисекундах. – Maxi

+0

Каков минимальный размер вашей розовой капли? Вы должны быть уверены, что не закрылись из-за каких-то шумных розовых точек. Вы можете установить его на 10, 20, 50, 100 и посмотреть, что работает лучше всего. Лучшим подходом было бы получить размер наибольшего blob в маске и выйти из него, достаточно большой. Это будет более устойчивым к шумным точкам. – Miki

ответ

0

петля с безусловным break (и без возможных continue) не имеет смысла, потому что тогда он не является семантический не петлей.

Тест должен быть в пределах цикла, потому что вы хотите применить его к каждому захваченному изображению, пока не нажмете на него первое с розовым. А затем break цикл. Не выходите из программы здесь, потому что тогда код очистки после цикла больше не выполняется. Выход из игры SystemExit немного странный, вот что должно сделать функция sys.exit().

import cv2 
import numpy as np 

def main(): 
    lower_pink = np.array([160, 50, 50]) 
    upper_pink = np.array([180, 255, 255]) 
    threshold = 100 # TODO Adapt to your needs. 
    cap = cv2.VideoCapture(0) 

    while True: 
     _, frame = cap.read() 
     hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
     mask = cv2.inRange(hsv, lower_pink, upper_pink) 
     masked = cv2.bitwise_and(frame, frame, mask=mask) 
     cv2.imshow('frame', frame) 
     cv2.imshow('mask', mask) 
     cv2.imshow('masked', masked) 
     # if cv2.countNonZero(mask) > threshold: 
     #  print('FOUND') 
     #  break 
     print(cv2.countNonZero(mask)) 
     # 
     # Wait for escape key. 
     # 
     if cv2.waitKey(500) == 27: 
      break 

    cv2.destroyAllWindows() 


if __name__ == '__main__': 
    main() 

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

+0

Эй, спасибо, что исправил меня. Я новичок. Код действительно работал нормально, но проблема в том, что он даже не отображает окно маски и результатов, и я получаю сообщение FOUND в миллисекундах. Я даже пытался изменить пороговое значение, но тот же результат. Действительно ли код работает нормально или есть какая-то проблема? – Maxi

+0

Я изменил код, чтобы вы могли проверить, сколько пикселей имеет маска при разных обстоятельствах (объекты, освещение, ...). – BlackJack

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