1:下载软件
这里我使用的是pycharm(Python集成开发环境)2023.1.3版与opencv
pycharm下载网址:PyCharm:JetBrains为专业开发者提供的Python IDE
这里下载免费版的。
opencv下载网址:OpenCV - Open Computer Vision Library
点击Libray--Releases-- 4.5.2版本
2:分部学习opencv功能
如图先建立项目(如不懂如何操作的可以看一下py的基础教学视频)
然后在文件--设置--python解释器中下载以下的软件包(建议下相同版本的,不同版本程序可能报错),不懂怎么下载的也可以去看视频
现在已经把环境搭建好了,下面我们开始学习。
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修改尺寸
文章来源地址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()
同样需要改文件路径与图片,可以试试这个图片:
会有识别错误的,后期可以调试(改(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安装包进行安装,安装完成后的安装目录如下:
--通过安装目录下的readme-windows.txt文件了解到,该目录下还缺少libeay32.dll ssleay32.dll pthreadVC2.dll这三个DLL。
--添加环境变量
为了后续操作的便捷性,将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消息。
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
下载后,点击左下角选项进入配置界面,配置MQTT
填写如下信息,服务器地址为前面下载的mosquitto MQTT代理服务器IP地址,端口都市区1883,用户名和密码是之前自己设置的
以上完成后,本地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.设置权限
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地址,不是计算机的)
并且在HA上可以看到信息,具体的看下面
这里配置好了之后,就可以联网使用了,我这里选择的是Home Assistant系统进行连接通讯。
使用HA系统的node red模块对摄像头编程控制
node red mqtt
文章来源:https://www.toymoban.com/news/detail-815841.html
到了这里,关于人脸识别(python+opencv)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!