所需模块安装
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()
自行寻找视频测试,此外我们还可以获取眼睛,面部位置等