Стабилизация лицевых ориентиров

Я создал модель для предсказания глаз через модули openCV и Dlib на python. Переходя по этой ссылке. Модель при создании и я использовал ее в реальном времени для тестирования. Ориентиры были шаткими, и если я пытаюсь переместить / повернуть / наклонить голову, ориентиры не останутся на глазах, либо они будут двигаться вверх / вниз. Я попытался применить к нему оптический поток, но это тоже не помогло. Не могли бы вы помочь мне с этим, чтобы я смог стабилизировать ориентир?? Спасибо.

Вот фрагмент кода обнаружения глаз в реальном времени.

cap = cv2.VideoCapture(0)
_, frame = cap.read()
frame = imutils.resize(frame, width=600)
fst_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

detector = dlib.get_frontal_face_detector()

# pre = open("shape_predictor_68_face_landmarks.dat.bz2", 'rb')
# pred = joblib.load(pre)
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks (1).dat')

lk_params = dict(winSize = (10, 10),
                maxLevel = 4,
                criteria = (cv2.TERM_CRITERIA_EPS | cv2.TermCriteria_COUNT, 10, 0.03))

point = ()
eX = 0
eY = 0

while True:
    _, frame = cap.read()
    frame = imutils.resize(frame, width=600)
    grayframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = detector(grayframe, 0)

    for face in faces:
        (x, y, w, h) = face_utils.rect_to_bb(face)
        # print(x, y, w, h)

        cv2.rectangle(frame, (x , y), (x + w, y + h), (255,0,0), 2)

        landmarks = predictor(grayframe, face)
        landmarks = face_utils.shape_to_np(landmarks)
        for eX, eY in landmarks:
            if eX is not 0 and eY is not 0:
                # print("eye_pred")
                prev_points = np.array([[eX, eY]], dtype=np.float32)
                cv2.circle(frame, (eX, eY), 1, (0,0,255), -1)
                # print(prev_points)
                new_landmark, status, error = cv2.calcOpticalFlowPyrLK(fst_gray, grayframe, prev_points, None, **lk_params)
                fst_gray = grayframe.copy()
                prev_points = new_landmark
                nX, nY = new_landmark.ravel()
                cv2.circle(frame, (nX, nY), 1, (0,255,0), -1)
                # print(new_landmark)


    cv2.imshow("Video Stream", frame) 

0 ответов

Другие вопросы по тегам