【问题标题】:Get ROI from face landmark points cv2 dlib从人脸地标点 cv2 dlib 获取 ROI
【发布时间】: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)

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

所以,只转储面部边缘点周围的点。

【问题讨论】:

    标签: python opencv dlib


    【解决方案1】:

    在从预测器中获得 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]
    

    【讨论】:

    • 是的,我尝试了给定的解决方案,但它没有倾倒 roi,而是只创建了黑色图像!
    • 给出这种感觉: if point[0]
    • @U.Swap in Your case point[0] 没有访问给定点的 X 坐标,但是整个 numpy 数组请查看您的 get_landmarks 结构并相应地迭代。
    • if point[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 is not a numpy array, not a scalar
    猜你喜欢
    • 2017-02-09
    • 2021-03-22
    • 2019-05-11
    • 2017-10-18
    • 2014-12-02
    • 2016-08-08
    • 2017-01-18
    • 2017-07-19
    • 2017-10-28
    相关资源
    最近更新 更多