利用dlib库实现嘴巴位置识别

所需模块安装

pip3 install python-opencv
pip3 install dlib
pip3 install imutils 

dlib面部关键点信息图

在这里插入图片描述
我们实现的是嘴巴识别,关键的开始与结束点为49-67。

dlib获取嘴巴位置

# -*- coding=utf-8 -*-
import cv2
import dlib
import os
from imutils import face_utils


shape_detector_path = os.path.join("model", 'shape_predictor_68_face_landmarks.dat') #加载模型
detector = dlib.get_frontal_face_detector() # 定位器
predictor = dlib.shape_predictor(shape_detector_path) #预测人脸关键点

border = 5  #向外扩展5像素
MOUSE_START = 49-1 #嘴巴关键的位置开始点
MOUSE_END = 68-1   #嘴巴关键的位置结束点


img = cv2.imread("src/test.png")  #读取一张测试图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转换为灰度图
rects = detector(gray, 0)   
for rect in rects:
    shape = predictor(gray, rect)    #预测值
    points = face_utils.shape_to_np(shape)# 转换为numpy数组
    mouse_points = points[MOUSE_START:MOUSE_END]  #得到嘴巴位置坐标点,内围,外围
    mouseHull = cv2.convexHull(mouse_points)       #得到凸点范围,即为嘴巴外围左边点
    cv2.drawContours(img, [mouseHull], -1, (0, 255, 0), 1) #绘制多边形轮廓,嘴巴范围
    xr,yr,wr,hr = cv2.boundingRect(mouseHull)     #近似替代为矩形
    cv2.rectangle(img,(xr-border,yr-border),(xr+wr+border,yr+hr+border),(0,255,9),2)  #绘制矩形,嘴巴范围
    

cv2.imshow("Frame", img) # 显示图片
cv2.waitKey(0)           # 按任意键退出
cv2.destroyAllWindows()  # 销毁窗口

在这里插入图片描述
模型下载:
链接:https://pan.baidu.com/s/15F_e7IlNK3oQU1PQ1LwdfA
提取码:yd6z

dlib加载视频或读取摄像头

# -*- coding=utf-8 -*-
import cv2
import dlib
import os
from imutils import face_utils



shape_detector_path = os.path.join("model", 'shape_predictor_68_face_landmarks.dat')
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(shape_detector_path)

border = 5
MOUSE_START = 49-1
MOUSE_END = 68-1
cap = cv2.VideoCapture("src/eye.mp4")# 如何参数为0,读取摄像头信息,如果为文件,读取视频

while(1):
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    rects = detector(gray, 0)
    for rect in rects:
        shape = predictor(gray, rect)
        points = face_utils.shape_to_np(shape)
        mouse_points = points[MOUSE_START:MOUSE_END]
        mouseHull = cv2.convexHull(mouse_points)
        xr,yr,wr,hr = cv2.boundingRect(mouseHull)
        cv2.rectangle(img,(xr-border,yr-border),(xr+wr+border,yr+hr+border),(0,255,9),2)
        cv2.drawContours(img, [mouseHull], -1, (0, 255, 0), 1)

    key = cv2.waitKey(1) & 0xFF
    if key== 27: #ESC退出
        break
    cv2.imshow("Frame", img)

cap.release()
cv2.destroyAllWindows()

自行寻找视频测试,此外我们还可以获取眼睛,面部位置等

猜你喜欢

转载自blog.csdn.net/qq_38641985/article/details/121088545