我正在为以下任务编写代码: 1)拍摄包括人脸在内的视频文件 2)侦测人脸 3)裁剪脸部,并将其另存为新的视频文件(仅脸部)
该程序包括一个GUI,其工作方式如下:
A)当用户单击“记录”按钮时,人脸检测开始(它将此时间戳保存为start_time
)
B)当用户单击“停止”按钮时,人脸检测结束(应将此时间戳另存为end_time)
程序的另一个输出是保存或打印start_time
和end_time
。
我知道如何创建GUI,但我的问题不是。我在获取start_time
和end_time
时遇到问题。
以下是代码的主要部分,不包括GUI部分:
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')
输入视频文件'Sample.wmv'的长度为12秒,帧速率为每秒15帧。我的意思是捕获“ Sample.wmv”的整个12秒来测试代码。
结果如下:
length = 12356.0
fps = 1000.0
The video capture finished
Start_time : 1.0
End_time : 360.0
可以看出,当输入视频文件的帧频为15时,fps打印为1000.0。此外,end_time
为360毫秒。但是,输入影片的总时长为12秒。
请让我知道您对悖论结果的想法!