ubuntu下使用opencv和python实现人脸识别
1.直接使用古月大佬人脸识别程序修改,因为源程序设计到rospy,可以不使用,修改如下:
其中haarcascade_frontalface_alt.xml和haarcascade_profileface.xml可以在附录中直接查找
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import cv2
def detect_face(input_image):
# 使用级联表初始化haar特征检测器
cascade_1 = cv2.CascadeClassifier('data/haar_detectors/haarcascade_frontalface_alt.xml')
cascade_2 = cv2.CascadeClassifier('data/haar_detectors/haarcascade_profileface.xml')
# 设置级联表的参数,优化人脸识别,可以在launch文件中重新配置
haar_scaleFactor = 1.2
haar_minNeighbors = 2
haar_minSize = 40
haar_maxSize = 60
# 首先匹配正面人脸的模型
if cascade_1:
faces = cascade_1.detectMultiScale(input_image,
haar_scaleFactor,
haar_minNeighbors,
cv2.CASCADE_SCALE_IMAGE,
(haar_minSize, haar_maxSize))
# 如果正面人脸匹配失败,那么就尝试匹配侧面人脸的模型
if len(faces) == 0 and cascade_2:
faces = cascade_2.detectMultiScale(input_image,
haar_scaleFactor,
haar_minNeighbors,
cv2.CASCADE_SCALE_IMAGE,
(haar_minSize, haar_maxSize))
return faces
if __name__ == '__main__':
# read video stream
cap = cv2.VideoCapture(0) # 读取视频
while cap.isOpened(): # 当视频被打开时:
ret, frame = cap.read() # 读取视频,读取到的某一帧存储到frame,若是读取成功,ret为True,反之为False
if ret: # 若是读取成功
# cv2.imshow('frame', frame) # 显示读取到的这一帧画面
print("read video stream ok")
key = cv2.waitKey(25) # 等待一段时间,并且检测键盘输入
if key == ord('q'): # 若是键盘输入'q',则退出,释放视频
cap.release() # 释放视频
else:
cap.release()
open_face_detector = 1
if open_face_detector:
# 创建灰度图像
grey_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 创建平衡直方图,减少光线影响
grey_image = cv2.equalizeHist(grey_image)
# 尝试检测人脸
faces_result = detect_face(grey_image)
color = (50, 255, 50)
# 在opencv的窗口中框出所有人脸区域
if len(faces_result) > 0:
print("face recognition successful")
for face in faces_result:
x, y, w, h = face
cv2.rectangle(frame, (x, y), (x+w, y+h), color, 2)
cv2.imshow('frame', frame) # 显示读取到的这一帧画面
cv2.destroyAllWindows() # 关闭所有窗口
实现的检测效果并不是太好。
2.通过了解发现xml文件有很多,考虑换一个文件试一下效果,具体下载链接在:
https://github.com/opencv/opencv/tree/master/data/haarcascades
直接将检测的xml文件都换成识别脸部的
# 使用级联表初始化haar特征检测器
cascade_1 = cv2.CascadeClassifier('data/haarcascades/haarcascade_frontalface_default.xml')
cascade_2 = cv2.CascadeClassifier('data/haar_detectors/haarcascade_profileface.xml')
效果比之前的稍微好一点
3.使用谷歌开源的mediapipe框架,代码比较简单识别速度也是比较快的,不过要先安装好mediapipe的库,具体可以直接参考官方的源码:https://developers.google.cn/mediapipe/solutions/vision/face_detector/python#image_1
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_face = mp.solutions.face_detection
def face_detection_mediapipe():
# read video stream
cap = cv2.VideoCapture(0) # 读取视频
while cap.isOpened(): # 当视频被打开时:
ret, frame = cap.read() # 读取视频,读取到的某一帧存储到frame,若是读取成功,ret为True,反之为False
if ret: # 若是读取成功
# cv2.imshow('frame', frame) # 显示读取到的这一帧画面
print("read video stream ok")
key = cv2.waitKey(25) # 等待一段时间,并且检测键盘输入
if key == ord('q'): # 若是键盘输入'q',则退出,释放视频
cap.release() # 释放视频
else:
cap.release()
with mp_face.FaceDetection(min_detection_confidence=0.5) as faces:
results = faces.process(frame)
if results.detections:
print("hello")
for detection in results.detections:
mp_drawing.draw_detection(
frame,
detection)
cv2.imshow('frame', frame) # 显示读取到的这一帧画面
if __name__ == '__main__':
try:
face_detection_mediapipe()
except KeyboardInterrupt:
print ("Shutting down pose node.")
cv2.destroyAllWindows()
谷歌开源的库也可以实现对手势、人体姿势、物品分类的检测
4.在满足以上基本的人脸识别后希望可以检测出人名。
这部分直接参考的网上现成的代码:https://blog.csdn.net/u011477914/article/details/108269948
想实现的可以直接参考,就不在这详细重复了,另外在这里给大家说一下使用时候的注意事项:
就是报错:cv2.face has no attribute ‘LBPHFaceRecognizer_create’
问题的解决参考网上的一个是使用函数变了,就是把cv2.face.LBPHFaceRecognizer_create()改成cv2.face.LBPHFaceRecognizer.create(),我的没有解决问题;
然后说是没有安装opencv-contrib-python,重新装了一下显示已经装过了,还没有解决问题;
然后就是查看opencv和opencv-contrib-python的版本是否一致,最后发现我的opencv是4.8.1,opencv-contrib-python是4.8.0不对应,把旧的opencv-contrib-python卸载,重新装了4.8.1.47的opencv-contrib-python,可以了。