Python 从面部标志点cv2 dlib获得ROI

Python 从面部标志点cv2 dlib获得ROI,python,opencv,dlib,Python,Opencv,Dlib,Am使用以下代码使用dlib在网络摄像头实时捕获的帧上绘制面部地标点,现在,Am需要的是获得限制所有符合面部的点的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

Am使用以下代码使用dlib在网络摄像头实时捕获的帧上绘制面部地标点,现在,Am需要的是获得限制所有符合面部的点的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)

,但在这里,我不希望使用

面=级联。检测多尺度(im,1.3,5)

,我只想要环绕面部地标点的形状,上面代码的输出如下所示


因此,只需转储环绕面部边缘点的点。

从预测器获得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]
minX,minY=10000000,10000000
maxX,maxY=0,0
对于get_地标中的点:
如果点[0]最大值:
maxX=点[0]
elif点[1]最大值:
maxY=点[1]
bounding_rect=[minX,minY,maxX-minX,maxY-minY]

是的,我尝试了给定的解决方案,但它没有放弃roi,而是只创建了黑色图像!给出此选项:if点[0]点[0]没有访问给定点的X坐标,但整个numpy数组请查看您的
获取地标结构并相应迭代。如果点[0,0]maxX:maxX=point[0,0]elif point[0,1]maxY:maxY=point[0,1]bounding\rect=[minX,minY,maxX-minX,maxY-minY]cv2.imwrite('face.png',bounding\rect)这是我尝试过的,但是抛出:TypeError:img不是numpy数组,也不是标量