Значения графика не обновляются в VideoCapture OpenCV - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь нанести ключевые точки лица на видеокадр с помощью Open CV Video Capture. Я использую обученную модель CNN Pytorch. Вот код:

cap = cv.VideoCapture(0)
time.sleep(2.0)

while cap.isOpened():
    ret, frame = cap.read()
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
        cv.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
        face_gray = gray[y:y+h, x:x+w]

    sample = cv.resize(face_gray, (96, 96))
    sample = sample.astype('float32')/255
    sample = np.asarray(sample).reshape(1,96,96)
    sample = torch.from_numpy(sample).unsqueeze(0).to(device)
    output = saved_model(sample)
    output = output.view(-1, 2).detach()
    output = (output * 48) + 48
    output = output.cpu().numpy()
    print(output)
    for i in range(15):
        cv.circle(frame, (output[i][0], output[i][1]), 1, (0, 0, 255), -1)

    cv.imshow("Frame", frame)
    key = cv.waitKey(1) & 0xFF


    if key == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

Входной размер: факел. Тензор ([1,1,96,96]), 1 изображение в оттенках серого

Выходной размер: факел. Тензор ([15, 2]), (x, y) из 15 ключевых точек лица

При обнаружении лица (с использованием каскада Хаара) в режиме видеозахвата выходные значения совпадают, из-за чего график ключевых точек не изменяется.

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Я не вижу ничего плохого в вашем блоке кода. Единственная возможная ошибка, которая может произойти, - это когда у вас есть статичное лицо в видеокадре, которое детектор HaarCascade обнаружил как последнее лицо. Глядя на ваш блок кода, становится очевидным, что вы пытаетесь определить ключевые точки только по одному лицу на видеокадр. Попробуйте переместить блок sample = ..., output = ... и for ...:, чтобы отобразить ключевые точки в итераторе граней for ....

Блок кода после предложенных изменений будет выглядеть следующим образом:

cap = cv.VideoCapture(0)
time.sleep(2.0)

while cap.isOpened():
    ret, frame = cap.read()
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
        cv.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
        face_gray = gray[y:y+h, x:x+w]

        # Push this block into for iterator of faces
        sample = cv.resize(face_gray, (96, 96))
        sample = sample.astype('float32')/255
        sample = np.asarray(sample).reshape(1,96,96)
        sample = torch.from_numpy(sample).unsqueeze(0).to(device)
        output = saved_model(sample)
        output = output.view(-1, 2).detach()
        output = (output * 48) + 48
        output = output.cpu().numpy()
        print(output)
        for i in range(15):
            cv.circle(frame, (output[i][0], output[i][1]), 1, (0, 0, 255), -1)
        # End block

    cv.imshow("Frame", frame)
    key = cv.waitKey(1) & 0xFF


    if key == ord('q'):
        break

cap.release()
cv.destroyAllWindows()
0 голосов
/ 16 июня 2019

Этот код не обрабатывает случай len(faces) > 0 первоначально для некоторого количества итераций, затем len(faces) == 0 впоследствии. Если это произойдет, face_gray сохранит свое прежнее значение, и вы будете использовать новый frame на основе устаревшего face_gray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...