人脸识别(python+opencv)

这篇具有很好参考价值的文章主要介绍了人脸识别(python+opencv)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1:下载软件

这里我使用的是pycharm(Python集成开发环境)2023.1.3版与opencv

pycharm下载网址:PyCharm:JetBrains为专业开发者提供的Python IDE

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

 这里下载免费版的。

opencv下载网址:OpenCV - Open Computer Vision Library

 点击Libray--Releases-- 4.5.2版本       

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

2:分部学习opencv功能

如图先建立项目(如不懂如何操作的可以看一下py的基础教学视频)

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

 然后在文件--设置--python解释器中下载以下的软件包(建议下相同版本的,不同版本程序可能报错),不懂怎么下载的也可以去看视频

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

 现在已经把环境搭建好了,下面我们开始学习。

01读取图片及灰度转变

#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('telangpu.png')
#灰度转换
gray_img = cv.cvtColor(img,cv.COLOR_YCrCb2BGR)
#显示灰度
cv.imshow('gray',gray_img)
#保存灰度图片
cv.imwrite('gray_telangpu1.png',gray_img)
#显示图片
cv.imshow('read_img',img)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

这里的图片大家可以选不一样的,需要带有人脸的照片。

02修改尺寸

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

 文章来源地址https://www.toymoban.com/news/detail-815841.html

同样也是需要修改成自己的图片,这里是修改图片尺寸大小。

03绘制矩形

#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('telangpu.png')
#坐标
x,y,w,h=200,200,200,200
#绘制矩形
cv.rectangle(img,(x,y,x+w,y+h),color=(0,0,255),thickness=1)
#绘制圆形
cv.circle(img,center=(x+w,y+h),radius=200,color=(255,0,0),thickness=2)
#显示
cv.imshow('re_img',img)
while True:
    if ord('q') == cv.waitKey(0):
        break
#释放内存
cv.destroyAllWindows()

需要修改图片。可以修改程序的XYWH数值,来勾画出不同位置: 

04人脸检测

#导入cv模块
import cv2 as cv
#检测函数
def face_detect_demo():
        gary =cv.cvtColor(img,cv.COLOR_HSV2BGR)
        face_detect = cv.CascadeClassifier('C:/Users/GYW/Downloads/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
        face = face_detect.detectMultiScale(gary,1.01,5,0,(100,100),(300,300))
        for x,y,w,h in face:
            cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        cv.imshow('result',img)
#读取图片
img = cv.imread('gyw.jpg')
#检测函数
face_detect_demo()
#等待
while True:
    if ord('q') == cv.waitKey(0):
        break
#释放内存
cv.destroyAllWindows()

路径选择与图片需要修改,搜索文件夹找到电脑opencv下载位置,opencv后的选择可以参考上图。

face = face_detect.detectMultiScale(gary,1.01,5,0,(100,100),(300,300))

这一行可以选择默认值,即face = face_detect.detectMultiScale(gary)

注释:1.01为缩放倍数;5为检测5遍后确定人脸;0为默认值,不需要改;(100,100)为人脸最小面积;(300,300)为人脸最大范围

05检测多个人脸

#导入cv模块
import cv2 as cv
#检测函数
def face_detect_demo():
        gary =cv.cvtColor(img,cv.COLOR_HSV2BGR)
        face_detect = cv.CascadeClassifier('C:/Users/GYW/Downloads/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
        face = face_detect.detectMultiScale(gary,1.01,5,0,(10,10),(200,200))
        for x,y,w,h in face:
            cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        cv.imshow('result',img)
#读取图片
img = cv.imread('111.png')
#检测函数
face_detect_demo()
#等待
while True:
    if ord('q') == cv.waitKey(0):
        break
#释放内存
cv.destroyAllWindows()

同样需要改文件路径与图片,可以试试这个图片:

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

会有识别错误的,后期可以调试(改(gary,1.01,5,0,(10,10),(200,200))这部分)。

06视频检测

#导入cv模块
import cv2 as cv
#检测函数
def face_detect_demo(img):
        gary =cv.cvtColor(img,cv.COLOR_HSV2BGR)
        face_detect = cv.CascadeClassifier('C:/Users/GYW/Downloads/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
        face = face_detect.detectMultiScale(gary,1.25,5,0)
        for x,y,w,h in face:
            cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        cv.imshow('result',img)

#读取摄像头
# cap = cv.VideoCapture(0)
cap = cv.VideoCapture('1685802174999.mp4')
#循环
while True:
    flag,frame = cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord('q') == cv.waitKey(1):
        break
#释放内存
cv.destroyAllWindows()
#释放摄像头
cap.release()

(gary,1.25,5,0)这部分使用1.25是因为我在尝试的时候1.25是可以比较流畅的播放视频并且识别的也没什么大问题,各位可以试试哪一个更好或者选择默认(gary)

这里需要修改文件路径与视频(带有人脸的视频)

07拍照保存

#导入模块
import cv2
#摄像头
cap=cv2.VideoCapture(0)
falg = 1
num = 1
while(cap.isOpened()):#检查是否在开启状态
    ret_flag,Vshow = cap.read()#得到每帧图像
    cv2.imshow("Capture_Test",Vshow)#显示图像
    k = cv2.waitKey(1) & 0xFF#按键判断
    if k == ord('s'):#保存
        cv2.imwrite("C:/Users/GYW/Downloads/opencv/sources/data/pc/"+str(num)+"sj"+".jpg",Vshow)
        print("sucess to save"+str(num)+".jpg")
        print("-----------------")
        num += 1
    elif k == ord('q'):#退出
        break
#释放摄像头
cap.release()
#释放内存
cv2.destroyAllWindows()

需要一个摄像头接入电脑,改路径。

08训练数据

import os
import cv2
from PIL import Image
import numpy as np

def getImageAndLabels(path):
    #储存人脸数据
    facesSamples=[]
    #储存姓名数据
    ids=[]
    #储存图片信息
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    #加载分类器
    face_detector = cv2.CascadeClassifier('C:/Users/GYW/Downloads/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
    #遍历列表中的图片
    for imagePath in imagePaths:
        #打开图片,灰度化PIL有九种不同的模式:1,L(灰度图像),P,RGB,RGBA,CMYK,YCbcr,I,F.
        PIL_img=Image.open(imagePath).convert('L')
        #将图像转换为数组,以黑白深浅
        img_numpy=np.array(PIL_img,'uint8')
        #获取图片人脸特征
        faces = face_detector.detectMultiScale(img_numpy)
        #获取每张图片的id和姓名
        id = int(os.path.split(imagePath)[1].split('.')[0])
        #预防无面容照片
        for x,y,w,h in faces:
              ids.append(id)
              facesSamples.append(img_numpy[y: y + h, x: x + w])
    #打印脸部特征和id
    print('id:', id)
    print('fs:', facesSamples)
    return facesSamples, ids

if __name__ == '__main__':
   #图片路径
   path ='picture'
   #获取图像数组和id标签数组和姓名
   faces,ids=getImageAndLabels(path)
   #加载识别器
   recognizer=cv2.face.LBPHFaceRecognizer_create()
   #训练
   recognizer.train(faces,np.array(ids))
   #保存文件
   recognizer.write('trainer/trainer.yml')

改路径,图片;这里需要多保存一些图片之后再训练数据,可以提高人脸识别的准确率。

09人脸识别

import cv2
import numpy as np
import os
# coding=utf-8
import urllib
import urllib.request
import hashlib

#加载训练数据集文件
recogizer=cv2.face.LBPHFaceRecognizer_create()
recogizer.read('trainer/trainer.yml')
names=[]
warningtime = 0
#md5加密
def md5(str):
    import hashlib
    m = hashlib.md5()
    m.update(str.encode("utf8"))
    return m.hexdigest()

statusStr = {
    '0': '短信发送成功',
    '-1': '参数不全',
    '-2': '服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间',
    '30': '密码错误',
    '40': '账号不存在',
    '41': '余额不足',
    '42': '账户已过期',
    '43': 'IP地址限制',
    '50': '内容含有敏感词'
}


def warning():
    smsapi = "http://api.smsbao.com/"
    # 短信平台账号
    user = 'xxxxxx'
    # 短信平台密码
    password = md5('xxxxxxxx')
    # 要发送的短信内容
    content = '【报警】\n原因:检测到未知人员\n地点:xxx'
    # 要发送短信的手机号码
    phone = 'xxxxxxx'

    data = urllib.parse.urlencode({'u': user, 'p': password, 'm': phone, 'c': content})
    send_url = smsapi + 'sms?' + data
    response = urllib.request.urlopen(send_url)
    the_page = response.read().decode('utf-8')
    print(statusStr[the_page])

#准备识别的图片
def face_detect_demo(img):
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度
    face_detector=cv2.CascadeClassifier('C:/Users/GYW/Downloads/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
    face=face_detector.detectMultiScale(gray)
    #face=face_detector.detectMultiScale(gray)
    for x,y,w,h in face:
        cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)
        # 人脸识别(预测,评分)
        ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
        #print('标签id:',ids,'置信评分:', confidence)
        if confidence > 80:
            global warningtime
            warningtime += 1
            if warningtime > 100:
               warning()
               warningtime = 0
            cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
            cv2.putText(img,str(names[ids-1]+str(confidence)), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
    cv2.imshow('result',img)
    #print('bug:',ids)

def name():

    path = 'picture'
    #names = []
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    for imagePath in imagePaths:
       name = str(os.path.split(imagePath)[1].split('.',2)[1])
       names.append(name)


# cap=cv2.VideoCapture('111.mp4')
cap=cv2.VideoCapture(0)
# #cap = cv2.VideoCapture("rtsp://admin:zM123456@192.168.1.115:554/stream1")
name()
while True:
    flag,frame=cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord('q') == cv2.waitKey(10):
        break

cv2.destroyAllWindows()
cap.release()
#print(names)

发送短信的模块需要自己改,去网站注册之后修改数据,也可以用其他的方法进行通知。

修改路径,图片,视频。

以上就是人脸识别的完整程序,此时的摄像头已经可以WiFi接入电脑,但是还不能联网,下面介绍如何使用mqtt来接入摄像头。

MQTT (Message Queuing Telemetry Transport) 是一种轻量级的发布/订阅消息传输协议,通常用于物联网(IoT)和传感器应用。它是一种可靠、高效、灵活的协议,具有低延迟和带宽要求较低的特点。

MQTT使用基于TCP/IP的网络传输数据,并支持发布者(publisher)和订阅者(subscriber)之间的异步通信。发布者将消息发布到一个特定的主题(topic),而订阅者则通过订阅主题来接收消息。

3:mosquitto 在 Windows 上的安装

--先下载文件

百度网盘链接:https://pan.baidu.com/s/1ZiRKIXSviXxLHhDYs_LZqQ?pwd=p9jd 
提取码:p9jd

--选择Mosqutto安装包进行安装,安装完成后的安装目录如下:

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

--通过安装目录下的readme-windows.txt文件了解到,该目录下还缺少libeay32.dll ssleay32.dll pthreadVC2.dll这三个DLL。

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

--添加环境变量

为了后续操作的便捷性,将mosquitto和openSSL的可执行文件路径添加至系统环境变量。

--验证
注意:若第五步未执行,则需要切换工作路径到mosquitto的安装目录下:

打开cmd命令窗口,输入mosquitto -d -v启动代理端。
重新打开一命令窗口,输入mosquitto_sub -d -v -t test订阅主题为test的消息。
再次打开一命令窗口,输入mosquitto_pub -d -t test -m hellomqtt发布一条主题为test,消息内容为hellomqtt的消息。
一切正常的话,可以看到订阅端窗口收到了主题为test的hellomqtt消息。

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

PYTHON进行MQTT通讯所需代码

import paho.mqtt.client as mqtt

MQTT_USER = "hachina"
MQTT_PASS = "hachina"
client = mqtt.Client()
client.username_pw_set(MQTT_USER, MQTT_USER)
client.connect("192.168.1.109", 1883, 60)
client.publish("test", "on")
client.disconnect()

 MQTT通讯HASS平台准备工作

首先在HA上下载mqtt

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

 下载后,点击左下角选项进入配置界面,配置MQTT

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

 填写如下信息,服务器地址为前面下载的mosquitto MQTT代理服务器IP地址,端口都市区1883,用户名和密码是之前自己设置的

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

以上完成后,本地PC端就已经可以通过·MQTT协议与HASS通讯了。

给MQTT设置用户名密码:

1、找到MQTT安装目录文件夹,找到配置文件mosquitto.conf打开,末尾加入下面文本,保存退出

#设置不允许匿名登录
allow_anonymous false
#设置账户密码文件位置为 D:\Program Files\mosquitto\pwfile.example
password_file D:\Program Files\mosquitto\pwfile.example

2.设置权限

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

 2、win+R打开命令行窗口,复制下载到的文件夹地址,进入到MQTT安装路径
输入:

mosquitto_passwd -c ./pwfile.example hachina

用户可以自定义密码,输入密码时屏幕是不显示的,如果提示没有权限可以试试用ctrl+shift+enter打开cmd(有管理员的权限)

电脑本机测试是否成功
打开两个命令运行框,都进入mosquitto安装的文件夹,一个用来发布信息,一个用来接受信息。当地址一致时,可以接收同一主题下信息。
本机电脑订阅代码:mosquitto_sub -h 192.168.1.109 -t test -u hachina -P hachina
本机电脑发布代码:mosquitto_pub -h 192.168.1.109 -t test -m "on" -u hachina -P hachina
-t为主题,-m为消息内容,-u为用户名,-P为密码,-h为地址(ha系统的ip地址,不是计算机的)

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

 opencv python 人脸识别,python,开发语言,计算机视觉,opencv

并且在HA上可以看到信息,具体的看下面

这里配置好了之后,就可以联网使用了,我这里选择的是Home Assistant系统进行连接通讯。

使用HA系统的node red模块对摄像头编程控制 

node red mqtt

opencv python 人脸识别,python,开发语言,计算机视觉,opencv

 

到了这里,关于人脸识别(python+opencv)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python人脸识别考勤系统 dlib+OpenCV和Pyqt5、数据库sqlite 人脸识别系统 计算机 毕业设计 源码

    Python语言、dlib、OpenCV、Pyqt5界面设计、sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如果两张图片来源于同一个人,那么两个图片所映射的空间向量距离就很近,否则就会很远。因此,可以通过提取图片并映射到

    2024年02月08日
    浏览(57)
  • 计算机毕业设计:基于python人脸识别考勤系统 OpenCV+Dlib(包含文档+源码+部署教程)

    [毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 。 Python语言、dlib、OpenCV、Pyqt5界面设计、sqlite3数据库 方法实现、实现步骤 1、实例化人脸检测

    2024年02月04日
    浏览(68)
  • OpenCV完结篇——计算机视觉(人脸识别 || 车牌识别)

    scaleFactor调整哈尔级联器的人脸选框使其能框住人脸 官方教程指路 每个特征都是通过从黑色矩形下的像素总和减去白色矩形下的像素总和获得的单个值 级联器模型文件位置 识别嘴就会不精确了 识别鼻子 只要不测口,还是比较准确的 测口准确度太低!!! 安装很简单,这里

    2024年02月19日
    浏览(56)
  • 计算机视觉丨基于OpenCV的人脸识别打卡系统

    本期内容:基于OpenCV的WANT公司人脸识别打卡系统。 项目需求 : pycharm opencv numpy 项目下载路径:https://download.csdn.net/download/m0_68111267/88754360 社会上很多公司,学院都需要使用手机或者智能软件进行打卡签到。随着计算机技术的飞速发展,计算机视觉技术也越来越成熟了,例如

    2024年01月18日
    浏览(53)
  • 计算机竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 人脸性别年龄识别系统 - 图像识别 opencv 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https

    2024年02月10日
    浏览(101)
  • 基于深度学习的人脸性别年龄识别 - 图像识别 opencv 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 人脸性别年龄识别系统 - 图像识别 opencv 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https

    2024年02月06日
    浏览(72)
  • 【计算机毕设项目】基于opencv、dilb的员工人脸识别考勤系统

    基于opencv、dilb的员工人脸识别考勤系统 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 选题“员工刷脸考勤”,要求采用python语言开发,可以通过摄像头添加员工面部信息,这里就涉及到两个具体的个问题,一个是应该以什么样的数据来标识每一个员工的面部

    2024年02月03日
    浏览(52)
  • 基于深度学习的人脸专注度检测计算系统 - opencv python cnn 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的人脸专注度检测计算算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.co

    2024年02月07日
    浏览(213)
  • 计算机竞赛 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的人脸专注度检测计算算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.co

    2024年02月10日
    浏览(150)
  • 计算机毕设 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月11日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包