Я пишу код для следующих задач: 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_time
360 мсТем не менее, общая продолжительность входного фильма составляет 12 секунд.
Пожалуйста, дайте мне знать ваше представление о парадоксальных результатах!