Python+OpenCv+Dlib
#实现人脸检测+表情识别
.xml表情识别库下载
“”"
从USB摄像头中识别人脸,并实时标出面部特征点,简单判断情绪
我在原有程序上增加了串口通讯 因为原来的程序在识别笑脸的时候只是判断上下嘴唇的张合
没有考虑左右嘴角之间的张开变化,这就限制了惊讶表情的识别,在延时上加了多进程函数能
延缓串口的读取速度还不影响表情识别的速度,配合pyserial就可以实现向下位机传输字符串,实现下位机根据上位机的表情检测做出相应的反应。
68个点的识别也是方面我们对表情的判断,可以不显示出来,但是68个点依然可以用来判断表情。
“”"
import threading#多线程
import time
import dlib # 人脸识别的库dlib
import numpy as np # 数据处理的库numpy
import cv2 # 图像处理的库OpenCv
import serial
ser = serial.Serial()
ser.baudrate = 9600
ser.port = 'COM3'
data =''
data1 =''
print(ser)
ser.open()
print(ser)
print(ser.is_open) #检验串口是否打开
class face_emotion():
def __init__(self): # 类在实例化成对象的时候首先调用的方法
# 使用特征提取器get_frontal_face_detector
self.detector = dlib.get_frontal_face_detector()
# dlib的68点模型,使用训练好的特征预测器,加载人脸关键点检测器
self.predictor = dlib.shape_predictor("shape_predictor_68
_face_landmarks.dat")
#用opencv做前脸图像识别
self.face = cv2.CascadeClassifier('haarcascade_frontalface_alt_tree.xml')
# 使用opencv打开usb摄像头。
self.cap = cv2.VideoCapture(0)
def learning_face(self):
# 眉毛直线拟合数据缓冲
line_brow_x = []
line_brow_y = []
# cap.isOpened() 返回true/false 检查初始化是否成功
while (self.cap.isOpened()):
flag, im_rd = self.cap.read()
# 每帧数据延时1ms,延时为0读取的是静态帧
k = cv2.waitKey(1)
# 取灰度
img_gray = cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)
faces = self.face.detectMultiScale(img_gray, 1.1, 5, 0, (100, 100))
# 使用人脸检测器检测每一帧图像中的人脸。并返回人脸数rects
rects = self.detector(img_gray,0)#将第二个参数增加会改变画质,检测速度会减慢
# 要显示在屏幕上的字体
font = cv2.FONT_HERSHEY_SIMPLEX
i = 0
for (x, y, w, h) in faces:
cv2.rectangle(im_rd, (x, y), (x + w, y + h), (0, 255, 0), 2)
def stop()