Остановите веб-камеру после того, как она обнаружит определенный цвет

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

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()

1 ответ

Решение

Цикл с безусловным 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()

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

Другие вопросы по тегам