A series of convenience functions to make basic image processing operations such as translation, rotation, resizing, skeletonization, and displaying Matplotlib images easier with OpenCV and Python.
MIT License
4.54k
stars
1.03k
forks
source link
Camera Read and Write FPS not syncced - Python #203
Hi I am using Raspberry Pi 4b+ (4GB RAM) to implement a driver drowsiness detection system. The problem is apparently the processing of image and drowsiness determination is very taxing, so when the camera points at me the FPS reduces to 13 (Normally it is able to handle 30 FPS @ Full HD), whereas when the camera points to anywhere without a face, the FPS rises to 30. I have used threads to optimize the I/O read, but it doesn't seem to improve the FPS.
In the end, I don't mind if the whole video is 13 FPS, but the problem is when writing the video using openCV VideoWriter, I can only initialize the FPS once. So, when the camera FPS is variable but the video write is fixed, the video written will be fluctuating in speed all the time (slow with no face; normal with face).
As you can see from the code, for some reason, initializing the camera framerate to match the Video Write doesn't help. Writing is still not in sync for some reason.
Hope someone can help! Thanks in advance.
`#python drowniness_yawn.py --webcam webcam_index
from scipy.spatial import distance as dist
from imutils.video import VideoStream
from imutils.video.pivideostream import PiVideoStream
from imutils.video import FPS
from imutils import face_utils
from threading import Thread
import numpy as np
import argparse
import imutils
import datetime as dt
import time
import dlib
import cv2
import os
def alarm(msg):
global alarm_status
global alarm_status2
global saying
while alarm_status:
print('Eyes Closed')
saying = True
s = 'espeak "'+msg+'"'
os.system(s)
saying = False
if alarm_status2:
print('Yawn')
saying = True
s = 'espeak "' + msg + '"'
os.system(s)
saying = False
def eye_aspect_ratio(eye):
A = dist.euclidean(eye[1], eye[5])
B = dist.euclidean(eye[2], eye[4])
C = dist.euclidean(eye[0], eye[3])
ear = (A + B) / (2.0 * C)
return ear
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") #Faster but less accurate
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
Hi I am using Raspberry Pi 4b+ (4GB RAM) to implement a driver drowsiness detection system. The problem is apparently the processing of image and drowsiness determination is very taxing, so when the camera points at me the FPS reduces to 13 (Normally it is able to handle 30 FPS @ Full HD), whereas when the camera points to anywhere without a face, the FPS rises to 30. I have used threads to optimize the I/O read, but it doesn't seem to improve the FPS.
In the end, I don't mind if the whole video is 13 FPS, but the problem is when writing the video using openCV VideoWriter, I can only initialize the FPS once. So, when the camera FPS is variable but the video write is fixed, the video written will be fluctuating in speed all the time (slow with no face; normal with face).
As you can see from the code, for some reason, initializing the camera framerate to match the Video Write doesn't help. Writing is still not in sync for some reason.
Hope someone can help! Thanks in advance.
`#python drowniness_yawn.py --webcam webcam_index
from scipy.spatial import distance as dist
from imutils.video import VideoStream
from imutils.video.pivideostream import PiVideoStream from imutils.video import FPS from imutils import face_utils from threading import Thread import numpy as np import argparse import imutils import datetime as dt import time import dlib import cv2 import os
def alarm(msg): global alarm_status global alarm_status2 global saying
s = 'espeak "'+msg+'"'
os.system(s)
s = 'espeak "' + msg + '"'
os.system(s)
def eye_aspect_ratio(eye): A = dist.euclidean(eye[1], eye[5]) B = dist.euclidean(eye[2], eye[4])
def final_ear(shape): (lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"] (rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]
def lip_distance(shape): top_lip = shape[50:53] top_lip = np.concatenate((top_lip, shape[61:64]))
ap = argparse.ArgumentParser() ap.add_argument("-w", "--webcam", type=int, default=0, help="index of webcam on system") args = vars(ap.parse_args())
EYE_AR_THRESH = 0.3 EYE_AR_CONSEC_FRAMES = 45 YAWN_THRESH = 40 alarm_status = False alarm_status2 = False saying = False COUNTER = 0
print("-> Loading the predictor and detector...")
detector = dlib.get_frontal_face_detector()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") #Faster but less accurate predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
print("-> Starting Video Stream")
vs = VideoStream(src=args["webcam"]).start()
vs= PiVideoStream().start() vs.camera.framerate = 13
vs= VideoStream(usePiCamera=True, framerate = 15).start() #For Raspberry Pi
time.sleep(1.0)
fps = FPS().start()
fourcc = cv2.VideoWriter_fourcc(*"mp4v") writer = None (h,w) = (None, None)
while True: timestamp = dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S") frame = vs.read() frame = imutils.resize(frame, width=400) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.destroyAllWindows() vs.stop() writer.release()`