Задать вопрос
menma_uzumakie
@menma_uzumakie

Как создать триггер cv2 Python?

Умный глазок
Есть код
import cv2
import requests
import numpy as np
import imutils

haar_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
url = "http://xxx/shot.jpg"

while True:
    img_resp = requests.get(url)
    img_arr = np.array(bytearray(img_resp.content), dtype=np.uint8)
    img = cv2.imdecode(img_arr, -1)
    img = imutils.resize(img, width=1000, height=1800)
    
    faces_rect = haar_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=9)
    for (x, y, w, h) in faces_rect:
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), thickness=2)
    
    cv2.imshow("Ruslan", img)
    isWritten = cv2.imwrite('detected.png', img)   
    if cv2.waitKey(1) == 27:
        break

cv2.destroyAllWindows()

Он подключается к вайфай камере и дробит ее на снимки, соединяя в видеопоток.При этом в другом боте я могу в любое время в Телеграмм получить фото с камеры и задетекшенными лицами.Все работает хорошо.Пытался добавить триггер, мол когда видет лицо отправляет в ТГ скриншот с лицом.Пытался через условные конструкции сделать и т.д, но четно, в документации так же не нашел за что зацепиться в данном вопросе.Буду благодарен за любую помощь
  • Вопрос задан
  • 93 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
1. Выясни, что возвращает haar_cascade.detectMultiScale(), если в кадре нет лица - None или пустой массив?
2. Храни флаг "на прошлом кадре было лицо", обновляй его в конце тела цикла while True
3. После детекта лица проверяй, если на прошлом кадре лица не было, а на новом есть - делай отправку уведомления.

А вот как подружить ТГ бота с этим циклом - уже второй вопрос. Я бы запустил приведённый код в потоке и использовал queue.Queue для связи потока с анализом видео и потока с ботом. Т.е. когда обнаружил лицо, кидаешь кадр в очередь. А в основном потоке периодически проверяешь очередь на предмет наличия новых кадров.
Альтернативно, если бот асинхронный, можно переделать цикл на корутину, добавив небольшую задержку через await asyncio.sleep() и заменив requests на aiohttp. Не очень изящное решение, но может и сойдёт.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы