Получить временную метку видео файла, захваченного OpenCV, Python - PullRequest
0 голосов
/ 28 января 2019

Я пишу код для следующих задач: 1) Захват видеофайла, включая человеческое лицо 2) Обнаружение лица 3) Обрезка лица и сохранение его как нового видеофайла (только лицо)

ИПрограмма включает в себя графический интерфейс, который работает следующим образом: A) Когда пользователь нажимает кнопку «Запись», начинается обнаружение лица (следует сохранить эту метку времени как start_time) B) Когда пользователь нажимает кнопку «Стоп», обнаружение лица заканчивается (он должен сохранить эту метку времени как end_time)

Еще одним выводом программы является сохранение или печать start_time и end_time.

Я знаю, как создать графический интерфейс, и мой вопрос не оЭто.У меня проблема с получением start_time и end_time.

Ниже приведена основная часть кода, исключая часть графического интерфейса:

import cv2

video_filename = 'Sample.wmv'

cap = cv2.VideoCapture(video_filename)
print('length = ', cap.get(cv2.CAP_PROP_FRAME_COUNT), '\n')
print('fps = ', cap.get(cv2.CAP_PROP_FPS), '\n')

cascPath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)

ResultPath = 'output.wmv'

frame_size = (200, 200)   # Final frame size to save video file

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter(ResultPath, fourcc, fps = 25.0, frameSize = frame_size)

start = cap.get(cv2.CAP_PROP_POS_MSEC)

while(cap.isOpened()):

    ret, frame = cap.read()

    if ret==True:

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # Detect faces in the image
        faces = faceCascade.detectMultiScale(
                gray,
                scaleFactor=1.1,
                minNeighbors=5,
                minSize=(30, 30),
                )

        # Crop face
        for (x, y, w, h) in faces:
            face_frame = frame[y:y+h, x:x+w]
            face_frame = cv2.resize(face_frame, frame_size)

            # write the face_frame
            out.write(face_frame)

        cv2.imshow('frame', frame)

        if cv2.waitKey(25) & 0xFF == ord('q'):
            break

    else:
        print('Video capture finished')
        end = cap.get(cv2.CAP_PROP_POS_MSEC)
        break

cap.release()
out.release()
cv2.destroyAllWindows()

print('Start time : ', start, '\n')
print('End time : ', end, '\n')

Пример входного видеофайла.wmv 'имеет длину 12 секунд и частоту кадров 15 кадров в секунду.Я имею в виду захват всего 12 секунд Sample.wmv для тестирования кода.

И следующие результаты:

length =  12356.0 

fps =  1000.0 

The video capture finished

Start_time :  1.0 

End_time :  360.0  

Как видно, fps печатается как 1000.0 при частоте кадров входного видеофайла 15. Кроме того, end_time360 мсТем не менее, общая продолжительность входного фильма составляет 12 секунд.

Пожалуйста, дайте мне знать ваше представление о парадоксальных результатах!

...