Как исправить зависание cv2.imshow (из opencv) в django - PullRequest
0 голосов
/ 20 января 2019

Что я хочу сделать, так это когда пользователь нажимает на кнопку, django запускает код python и обнаруживает людей. Я использую VideoStream из imutils.video, но он просто всплывает в окне и останавливается. Он отлично работает, когда я проверяю распознавание лиц, но однажды я ставлю тот же код в Django. Я имею в виду, что он все еще может обнаруживать людей, но он обнаруживает только первый кадр, а затем останавливается.

VideoStream - из imutils.video, а cv2.imshow - из opencv.

Вот код для видеопотока. Даже если я запускаю видеопоток один (без кода распознавания лиц), он все равно останавливается.

def detect(request):
    vs = VideoStream("http://192.168.1.109:8080/video").start()
    while True:
        frame = vs.read()
        cv2.imshow("Frame", frame)
        key = cv2.waitKey(1) & 0xFF

        if key == ord("q") :
            break
        else:
            time.sleep(30)
            break
    cv2.destroyAllWindows()
    vs.stop()
    return render(request,"attendance/detect.html")

Если это не может быть исправлено, любая рекомендация может сделать то же самое? Спасибо

1 Ответ

0 голосов
/ 20 января 2019

Попробуйте это:

while True:
    frame = vs.read()
    cv2.imshow("Frame", frame)
    if cv2.waitKey(1) & 0xFF == ord("q"):
       break
cv2.destroyAllWindows()
vs.stop()

Честно говоря, я действительно не понимаю, что вы хотите сделать. Вы хотите ждать каждые 30 секунд, прежде чем делать еще одну фотографию? Кажется, что ваш код прерывается во время цикла как в условии if, так и в состоянии else

РЕДАКТИРОВАТЬ: поток 30 с

2 Вариант

1) для 30-секундного потока, вам нужно считать свои fps и разрывать после достижения fps * 30 циклов.

2) создать переменную флага и функцию тайм-аута

flag = 0 

def timeout(sleep):
    time.sleep(sleep)
    flag = 1

threading.Thread(target = timetout, args=(30,)).start()


# in your loop then break when 

if flag == 1:
    break
...