opencv / dlib 및 라이브 스트림 비디오를 사용하여 이마 (경계 상자) 영역을 가져 오는 방법이 있습니까?

남성

이 예제 에서처럼 이마를 사용하고 이미지화하고 자르는 것이 아니라 라이브 스트리밍 비디오에서 이마 영역을 가져 오는 프로젝트를 진행하고 있습니다. opencv 및 dlib를 사용하여 이마 영역을 감지하려면 어떻게해야합니까? .

cap = cv2.VideoCapture(0)

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predict_path)


while True:
    _, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = detector(gray) #detects number of faces present

    for face in faces:
        x1 = face.left()
        y1 = face.top()
        x2 = face.right()
        y2 = face.bottom()
        
        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 3)
        
        landmarks = predictor(gray, face)

        for n in range(68, 81):
            x = landmarks.part(n).x
            y = landmarks.part(n).y

            cv2.circle(frame, (x, y), 4, (0, 255, 0), -1) 
            

https://github.com/codeniko/shape_predictor_81_face_landmarks/blob/master/shape_predictor_81_face_landmarks.dat 사용의 랜드 마크를 사용하여 이마 영역을 얻었습니다.

하지만 내가 필요한 것은 랜드 마크가 이마 영역을 감지하는 곳에 직사각형 경계 상자입니다. 이것이 가능합니까? 그렇지 않다면 이마 부위를 얻으려면 어떻게해야합니까? 미리 감사드립니다.

Ahx

이미 다음과 같은 방법으로 원하는 좌표를 찾습니다.

for face in faces:
    x1 = face.left()
    y1 = face.top()
    x2 = face.right()
    y2 = face.bottom()

    cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 3)

하지만 내가 필요한 것은 랜드 마크가 이마 영역을 감지하는 곳에 직사각형 경계 상자입니다.

그런 다음 y 좌표를 변경합니다.

cv2.rectangle(frame, (x1, y1-100), (x2, y2-100), (0, 0, 255), 3)

최신 정보

이마 지점을 고수하려면 최소 및 최대 landmark좌표 를 얻은 다음 직사각형을 그려야합니다.

1 단계 : 좌표 얻기 :


    1. 초기화 x_ptsy_pts
    1. landmark(n)배열에 포인트를 저장 합니다.
for n in range(68, 81):
    x = landmarks.part(n).x
    y = landmarks.part(n).y

    x_pts.append(x)
    y_pts.append(y)

    cv2.circle(frame, (x, y), 4, (0, 255, 0), -1)

2 단계 : 감지 된 점 주위에 직사각형 그리기


    1. 최소 및 최대 포인트 얻기
x1 = min(x_pts)
x2 = max(x_pts)
y1 = min(y_pts)
y2 = max(y_pts)

cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 3)

결과:

웹캠을 확대 할 때 :

여기에 이미지 설명 입력

내가 멀리있을 때 :

여기에 이미지 설명 입력

암호:

import cv2
import dlib

cap = cv2.VideoCapture(0)

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_81_face_landmarks.dat")

while True:
    _, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = detector(gray)  # detects number of faces present

    for face in faces:
        x1 = face.left()
        y1 = face.top()
        x2 = face.right()
        y2 = face.bottom()

        landmarks = predictor(gray, face)

        x_pts = []
        y_pts = []

        for n in range(68, 81):
            x = landmarks.part(n).x
            y = landmarks.part(n).y

            x_pts.append(x)
            y_pts.append(y)

            cv2.circle(frame, (x, y), 4, (0, 255, 0), -1)

        x1 = min(x_pts)
        x2 = max(x_pts)
        y1 = min(y_pts)
        y2 = max(y_pts)

        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 3)

    cv2.imshow("out", frame)
    key = cv2.waitKey(1) & 0xFF

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관