香橙派(OrangePi)上利用OpenCv-Python实现人脸识别

举报
神龙居市 发表于 2022/11/29 17:24:36 2022/11/29
【摘要】 背景作为人脸识别的应用,数据存在的人脸信息需要云端支持,只靠一个客户端工作不能满足协同工作。只靠云端识别,那效率也太低了。客户端也要有起码的识别,如果用专业的客户端也是要花钱的。权衡之下,人脸Id在云端,客户端加一个人脸的基本特征识别。OpenCv是一个不错的选择,但是完全靠OpenCv准确度还不够。所以想做一个基本的人脸门槛过滤一下,通过的再到云端进一步对比。 硬件设备树莓派3B开发板一...

背景

作为人脸识别的应用,数据存在的人脸信息需要云端支持,只靠一个客户端工作不能满足协同工作。只靠云端识别,那效率也太低了。客户端也要有起码的识别,如果用专业的客户端也是要花钱的。
权衡之下,人脸Id在云端,客户端加一个人脸的基本特征识别。
OpenCv是一个不错的选择,但是完全靠OpenCv准确度还不够。所以想做一个基本的人脸门槛过滤一下,通过的再到云端进一步对比。

硬件设备

  • 树莓派3B开发板一个
  • 32G TF卡一个
  • USB摄像头一个

软件安装

TF卡中烧录树莓派操作系统,官网下载,我的版本是“2022-09-22-raspios-bullseye-arm64.img.xz”,使用工具win32diskimager,把镜像插入。
如果有HDMI的显示屏,给树莓派接上就可以当电脑使用了,就可以方便配网。如果没有,第一次插上网线,通过IP Scan工具找到树莓派IP,就可以SSH登录了。这些基础这次先略了。

支持环境安装

  • 首先更新
sudo apt-get update
sudo apt-get upgrade
  • 然后安装支持插件

如果有个别提示无法安装也无所谓

sudo apt install libgraphite2-3 libatspi2.0-0 libthai0 libxcb-shm0 libxcb-render0 libswscale5 librsvg2-2 libvorbisenc2 libavutil56 libzvbi0 libgsm1 libxinerama1 libxvidcore4 libsrt1.4-gnutls libswresample3 libatk1.0-0 libvorbisfile3 libogg0 libpangoft2-1.0-0 libpgm-5.3-0 libwayland-egl1 libharfbuzz0b libpango-1.0-0 libcairo2 libva-x11-2 libwayland-cursor0 libgfortran5 libxfixes3 libgme0 libxrender1 libvorbis0a libxi6 libudfread0 libspeex1 libwebpmux3 libsodium23 libdatrie1 libatk-bridge2.0-0 libxrandr2 libbluray2 libwavpack1 libxcomposite1 libpangocairo-1.0-0 libsoxr0 libshine3 libxkbcommon0 libvdpau1 libgtk-3-0 libopus0 librabbitmq4 libgdk-pixbuf-2.0-0 libavformat58 libmpg123-0 libxdamage1 libzmq5 libopenmpt0 libatlas3-base libva2 libva-drm2 libxcursor1 libssh-gcrypt-4 libavcodec58 libwayland-client0 libcairo-gobject2 libpixman-1-0 libdrm2 libsnappy1v5 libnorm1 libopenjp2-7 libtheora0 ocl-icd-libopencl1 libtwolame0 libepoxy0 libchromaprint1 libmp3lame0
# 安装pip工具,树莓派默认已经安装了Python
sudo apt-get install python-pip3  #安装pip3
sudo pip3 -h # 检查是否安装成功
  • 开始安装OpenCv-Python
sudo pip3 install opencv-python
  • 出现提示文字则安装成功
Installing collected packages: numpy, opencv-python
Successfully installed numpy-1.23.4 opencv-python-4.6.0.66
  • 因为人脸识别模块是单独的,所以还需要安装人脸识别
sudo pip3 install opencv-contrib-python
# 成功提示
Installing collected packages: opencv-contrib-python
Successfully installed opencv-contrib-python-4.6.0.66
  • 创建一个py文件,运行以下代码试试,xml文件可以
#from ctypes import FormatError
import sys
import cv2  # openCV库
import threading  # 线程模块
import time  # 时间模块  用于获取系统时间等操作
import numpy as np
import base64
class Main(object):
    def __init__(self) -> None:
        self.cap = None
        self.b_is_open = False
        self.b_exit_grabbing = False
        self.face_cascade = cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")
        self.eye_cascade = cv2.CascadeClassifier("data/haarcascade_eye.xml")
    def start(self):      
        self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) 
        #self.cap.set(cv2.CAP_PROP_FPS, 30)
        #self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
        #self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
        self.cap.open(0)
        if not self.cap.isOpened():
            # 如果没有检测到摄像头,报错
            raise Exception("Check if the camera is on.")
        while self.cap.isOpened():
            # 读取图像
            ret, img = self.cap.read()
            if not ret:
                continue
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            faces = self.face_cascade.detectMultiScale(
                gray,
                scaleFactor=1.1,
                minNeighbors=5,
                minSize=(50, 50),
                flags=cv2.CASCADE_SCALE_IMAGE,
            )
            count = 0;
            #print("Detected ", len(faces), " face")
            # 标记位置
            for (x, y, w, h) in faces:
                roi_gray = gray[y : y + h, x : x + w]
                roi_color = img[y : y + h, x : x + w]
                eyes = self.eye_cascade.detectMultiScale(roi_gray)
                if len(eyes) > 0:
                    imgFace = img[y : y + h, x : x + w]
                    # imgFace 上云
                    # 保存本地
                    filename =  str(time.time()) + ".jpg"
                    cv2.imwrite("/home/lwl/Pictures/"+filename, imgFace)
                    count += 1
                    img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 1)
                for (ex, ey, ew, eh) in eyes:
                    cv2.rectangle(roi_color,(ex, ey),(ex + ew,ey + eh),(0,255,0),1)
            label = "Result: Detected Faces "+str(len(faces))+", Eyes "+str(count)
            print(label)
            cv2.putText(img, label,(10, 20), cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 0.8, (0, 0, 0),1)
            cv2.imshow("window", img)  
            key = cv2.waitKey(1)
            if key & 0xFF == ord('q'):
                break
        self.cap.release()
        cv2.destroyAllWindows()
if __name__ == '__main__':
    Main().start()

image.png

最终效果看起来精准度还需要提高。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。