【发布时间】:2017-05-22 02:58:15
【问题描述】:
我正在使用以下代码使用 dlib 绘制面部标志点,实时从网络摄像头捕获的帧上,现在正在寻找的是获得限制所有符合面部的点的 ROI,代码如下:
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)
,我只想要围绕面部标志点的形状,上面代码的输出如下所示。
所以,只转储面部边缘点周围的点。
【问题讨论】: