How to use oak-d with rpi for drowsiness_detection

hi i have a problem with my code. i can’t connect to oak-d with my rpi. i’ll show my code.

from scipy.spatial import distance
from imutils import face_utils
import imutils
import dlib
import cv2
import depthai as dai

def eye_aspect_ratio(eye):
A = distance.euclidean(eye[1], eye[5])
B = distance.euclidean(eye[2], eye[4])
C = distance.euclidean(eye[0], eye[3])
ear = (A + B) / (2.0 * C)
return ear

thresh = 0.25
frame_check = 20
detect = dlib.get_frontal_face_detector()
predict = dlib.shape_predictor(“models/shape_predictor_68_face_landmarks.dat”)# Dat file is the crux of the code

(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_68_IDXS[“left_eye”]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_68_IDXS[“right_eye”]

Create pipeline

pipeline = dai.Pipeline()

Define source and output

camRgb = pipeline.create(dai.node.ColorCamera)
xoutVideo = pipeline.create(dai.node.XLinkOut)

xoutVideo.setStreamName(“video”)

Properties

camRgb.setBoardSocket(dai.CameraBoardSocket.RGB)
camRgb.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P)
camRgb.setVideoSize(1920, 1080)

xoutVideo.input.setBlocking(False)
xoutVideo.input.setQueueSize(1)

Linking

camRgb.video.link(xoutVideo.input)

Connect to device and start pipeline

with dai.Device(pipeline) as device:

video = device.getOutputQueue(name="video", maxSize=1, blocking=False)

while True:
    ret = video.get()
    frame = video.get()
    frame = imutils.resize(frame, width=450)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    subjects = detect(gray, 0)
    for subject in subjects:
        shape = predict(gray, subject)
        shape = face_utils.shape_to_np(shape)#converting to NumPy Array
        leftEye = shape[lStart:lEnd]
        rightEye = shape[rStart:rEnd]
        leftEAR = eye_aspect_ratio(leftEye)
        rightEAR = eye_aspect_ratio(rightEye)
        ear = (leftEAR + rightEAR) / 2.0
        leftEyeHull = cv2.convexHull(leftEye)
        rightEyeHull = cv2.convexHull(rightEye)
        cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)
        cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)
        if ear < thresh:
            flag += 1
            print (flag)
            if flag >= frame_check:
                cv2.putText(frame, "****************ALERT!****************", (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
                cv2.putText(frame, "****************ALERT!****************", (10,325),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
                #print ("Drowsy")
        else:
            flag = 0
    cv2.imshow("Frame", frame.getCvFrame())
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break

cv2.destroyAllWindows()
cap.release()

    # Get BGR frame from NV12 encoded video frame to show with opencv
    # Visualizing the frame on slower hosts might have overhead
    #cv2.imshow("video", videoIn.getCvFrame())

    #if cv2.waitKey(1) == ord('q'):
        #break

Please help me solve this problem!

1 Like

It is my problem.

Traceback (most recent call last):
File “/home/pi/Desktop/project/Drowsiness_Detection-master/Drowsiness_Detection.py”, line 51, in
frame = imutils.resize(frame, width=450)
File “/usr/local/lib/python3.9/dist-packages/imutils/convenience.py”, line 69, in resize
(h, w) = image.shape[:2]
AttributeError: ‘depthai.ImgFrame’ object has no attribute ‘shape’

1 Like

Here are some solutions to the attribute error python - Why am I getting AttributeError: Object has no attribute? - Stack Overflow

2 Likes

Thanks! i soleved it!

1 Like