2017-01-07 6 views
0

다음 코드를 사용하여 dlib를 사용하여 얼굴 표식 점을 그리면 실시간으로 웹캠에서 캡처 한 프레임에 다음과 같은 코드를 사용하여 원하는 점을 모두 따라야하는 ROI를 얻습니다 코드는 다음과 같습니다 :얼굴 표식 점에서 ROI 얻기 cv2 dlib

import cv2 
import dlib 
import numpy 
from imutils.video import FPS 
from imutils.video import WebcamVideoStream 
import imutils 

PREDICTOR_PATH = "./shape_predictor_68_face_landmarks.dat" 
predictor = dlib.shape_predictor(PREDICTOR_PATH) 
cascade_path = 'cascade/haarcascade_frontalface_default.xml' 
cascade = cv2.CascadeClassifier(cascade_path) 

webcam = WebcamVideoStream(src=0).start() 
fps = FPS().start() 

while True: 
    im = webcam.read() 
    im = imutils.resize(im, width=400) 

    faces = cascade.detectMultiScale(im, 1.3, 5) 
    if len(faces) != 0: 
     for (x, y, w, h) in faces.astype(long): 
      rect = dlib.rectangle(x, y, x + w, y + h) 
      #cv2.imwrite('face.png', rect) 
      get_landmarks = numpy.matrix([[p.x, p.y] for p in predictor(im, rect).parts()]) 

     for idx, point in enumerate(get_landmarks): 
      pos = (point[0, 0], point[0, 1]) 
      cv2.putText(im, str(idx), pos, 
         fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 
         fontScale=0.4, 
         color=(0, 0, 255)) 
      # cv2.drawContours(im, [pos], -1, (0, 255, 0), 2) 
#   hullIndex = cv2.convexHull(pos, returnPoints=False) 
#   cv2.imwrite('face.png', hullIndex) 
      cv2.circle(im, pos, 3, color=(0, 255, 255)) 
    cv2.imshow('Result', im) 

    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 
    fps.update() 

cv2.destroyAllWindows() 

이미지 랜드 마크 점을 이미지 파일에 덤프하고 싶습니다. 하지만 이해 할 수없는 나는, 나는 이들 랜드 마크 점에서 투자 수익 (ROI)을 추출 할 수있는 방법 내가 원하는,

cv2.imwrite('face.png', hullIndex)

사용하여 파일로 덤프하지만, 나는 여기 사각형

faces = cascade.detectMultiScale(im, 1.3, 5)

를 사용 drwaned 싶지 않아 얼굴 표식 지점을 포위하는 모양 만이 위 코드의 출력은 아래처럼 보입니다.

enter image description here

그래서 그냥 얼굴 에지 포인트를 둘레에만 포인트를 덤프.

답변

0

예측기에서 68 개의 얼굴 랜드 마크를 가져온 후에 모든 포인트를 반복하고 minX, minY, maxX, maxY을 업데이트하면 반복 후에 모든 얼굴 랜드 마크를 정확하게 둘러싸는 경계 사각형이 생성됩니다.

cv2.boundingRect(points)도 사용할 수 있지만이 방법으로 전달하기 전에 모든 점을 numpy 배열로 변환해야합니다.

하지만 난 당신에게 최초의 솔루션을 추천하고 좋은 소리

minX, minY = 10000000, 10000000 
maxX, maxY = 0, 0 
for point in get_landmarks: 
    if point[0] < minX: 
     minX = point[0] 
    elif point[0] > maxX: 
     maxX = point[0] 
    elif point[1] < minY: 
     minY = point[1] 
    elif point[1] > maxY: 
     maxY = point[1] 

bounding_rect = [minX, minY, maxX - minX, maxY - minY] 
+0

은, 내가 그것을 시도하자로 구현하기가 매우 쉽다. –

+0

네, 주어진 해결책을 시도했지만, 덤프 roi 아니라 대신 블랙 컬러 이미지를 만들었습니다! –

+0

이 예지를주는 경우 : point [0]