ubuntu下使用opencv和python实现实时视频流人脸识别

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,可以了。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人脸识别是计算机视觉领域的一个重要研究方向,而OpenCV是一个广泛使用的计算机视觉库,提供了许多用于图像处理和分析的函数和算法。在Python中结合OpenCV,可以轻松实现人脸识别。 以下是使用OpenCVPython进行人脸识别的基本步骤: 1. 安装OpenCV使用pip命令可以简单地安装OpenCV库: ``` pip install opencv-python ``` 2. 加载人脸识别模型 OpenCV提供了已训练好的人脸检测器CascadeClassifier,可以直接使用。首先需要下载训练集文件haarcascade_frontalface_default.xml,可以从OpenCV官网下载。 ``` python import cv2 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') ``` 3. 加载图像 使用cv2.imread()函数加载图像,可以读取本地图像文件或者通过网络获取图像。 ``` python img = cv2.imread('test.jpg') ``` 4. 进行人脸检测 使用CascadeClassifier.detectMultiScale()函数进行人脸检测,返回检测到的人脸坐标。 ``` python gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5) ``` 5. 绘制人脸框 使用cv2.rectangle()函数在图像上绘制出检测到的人脸框。 ``` python for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) ``` 6. 显示结果 使用cv2.imshow()函数显示处理结果,使用cv2.waitKey()函数等待用户输入。 ``` python cv2.imshow('img', img) cv2.waitKey(0) ``` 完整代码如下: ``` python import cv2 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') img = cv2.imread('test.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.imshow('img', img) cv2.waitKey(0) ``` 这段代码能够检测出输入图像中的人脸,并且在图像上绘制出人脸框。对于更复杂的人脸识别任务,可以结合机器学习算法进行特征提取和分类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值