首页 > 解决方案 > Python应用程序没有响应

问题描述

我正在尝试创建一个简单的应用程序,它可以了解我们的眼睛是否闭合。首先,我需要用于教学的数据,在此之前我想测试是否可以打印出这些值(参见下面的代码)。当我按下“q”键时,框架冻结并希望我输入另一个输入。之后,我按“q”或“w”键,应用程序开始没有响应。

我在 PyCharm IDE 中有 3 个警告,如下所示:

Name "left_eye_distance" can be undefined
Name "right_eye_distance" can be undefined
Name "nose_distance" can be undefined

我不知道它是否因为这些错误而没有响应,但我无法修复它。我的代码有问题吗?

import cv2
import dlib

detector = dlib.get_frontal_face_detector()  # face detector
model = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")  # face points

cap = cv2.VideoCapture(0)  # get video capture from camera

f = open("dataset.csv", "r+")


# Mid-point of eye pupil covers
def mid(p1, p2):
    return int((p1[0] + p2[0]) / 2), int((p1[1] + p2[1]) / 2)


# Get Right Eye Coordinates
def getRightEye():
    p1_right, p2_right = points_list[37], points_list[38]  # upper eye points
    p3_right, p4_right = points_list[40], points_list[41]  # lower eye points

    # put circles in those points
    cv2.circle(frame, (p1_right[0], p1_right[1]), 3, (0, 0, 255), -1)
    cv2.circle(frame, (p2_right[0], p2_right[1]), 3, (0, 0, 255), -1)
    cv2.circle(frame, (p3_right[0], p3_right[1]), 3, (0, 0, 255), -1)
    cv2.circle(frame, (p4_right[0], p4_right[1]), 3, (0, 0, 255), -1)

    # get mid-point of both upper eye and lower eye
    po_right = mid(p1_right, p2_right)
    po_bottom_right = mid(p3_right, p4_right)

    # create circles for mid-points
    cv2.circle(frame, (po_right[0], po_right[1]), 3, (255, 0, 0), -1)
    cv2.circle(frame, (po_bottom_right[0], po_bottom_right[1]), 3, (255, 0, 0), -1)

    return po_bottom_right[1] - po_right[1]


# Get Left Eye Coordinates
def getLeftEye():
    p1_left, p2_left = points_list[43], points_list[44]  # upper eye points
    p3_left, p4_left = points_list[47], points_list[46]  # lower eye points

    # put circles in those points
    cv2.circle(frame, (p1_left[0], p1_left[1]), 3, (0, 0, 255), -1)
    cv2.circle(frame, (p2_left[0], p2_left[1]), 3, (0, 0, 255), -1)
    cv2.circle(frame, (p3_left[0], p3_left[1]), 3, (0, 0, 255), -1)
    cv2.circle(frame, (p4_left[0], p4_left[1]), 3, (0, 0, 255), -1)

    # get mid-point of both upper eye and lower eye
    po_left = mid(p1_left, p2_left)
    po_bottom_left = mid(p3_left, p4_left)

    # create circles for mid-points
    cv2.circle(frame, (po_left[0], po_left[1]), 3, (255, 0, 0), -1)
    cv2.circle(frame, (po_bottom_left[0], po_bottom_left[1]), 3, (255, 0, 0), -1)

    return po_bottom_left[1] - po_left[1]


# Get Nose Distance
def getNose():
    return points_list[30][1] - points_list[27][1]


# Infinite loop
while True:

    _, frame = cap.read()  # read the capture
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # convert the captured frame to gray

    faces = detector(gray)  # get each detected faces in the frame

    for face in faces:  # for each face detected
        points = model(gray, face)  # get points in current face
        points_list = [(p.x, p.y) for p in points.parts()]  # put these face point shapes in a list both x,y coordinates

        # Get Eye Coordinates
        left_eye_distance = getLeftEye()
        right_eye_distance = getRightEye()
        nose_distance = getNose()

    cv2.imshow("frame", frame)  # show the frame on the screen

    # key press loop
    if cv2.waitKey(1) & 0xff == ord("q"):
        result = input(" Enter input : ")

        if result == "q":
            break

        elif result == "w":
            left = input(" Input data for left eye : ")
            right = input(" Input data for right eye : ")
            print(f" Left Eye : {left_eye_distance} "
                  f"Right Eye : {right_eye_distance}, "
                  f"Nose : {nose_distance}\n")

cap.release()  # capture ended
cv2.destroyAllWindows()  # all windows closed

标签: pythonmachine-learning

解决方案


推荐阅读