使⽤Opencv+树莓派实现⼈脸识别(⼀)图⽚⼈脸检测和摄像
头⼈脸捕捉
前置安装
我的树莓派是3b,就1G内存,系统为stretch版本,⾃带的python为3.5版本强烈建议在烧写树莓派系统时就直接⽤buster版本,⾃带的python版本在3.7及以上
Windows下直接使⽤PyCharm安装python-opencv,python-opencv-contrib,pyqt5,pyqt5-tools
树莓派下编译安装OpenCV:⼗分困难,可能要编译4-5⼩时
树莓派上python3已经可以直接使⽤pip包管理来直接安装OpenCVrectangle函数opencv
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libhdf5-dev libhdf5-serial-dev
sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
sudo apt-get install libatlas-base-dev
sudo apt-get install libjasper-dev
sudo pip3 install --no-cache-dir opencv-contrib-python==3.4.3.18
检测是否安装成功:
python3 test.py
import cv2
print(cv2.__version__)
这⾥我们直接在Windows使⽤PyCharm写代码,然后通过FileZilla传输到树莓派运⾏
静态图⽚检测
灰度化
度化处理就是将⼀幅彩⾊图像转化为灰度图像的过程
当R=G=B=255时,灰度值达到最⾼,显⽰为⽩⾊,反之则显⽰为⿊⾊。
图像灰度化的⽬的是为了简化矩阵
彩⾊图像中的每个像素颜⾊由R、G、B三个分量来决定,⽽每个分量的取值范围都在0-255之间,这样对计算机来说,彩⾊图像的⼀个像素点就会有16777216种颜⾊的变化范围
⽽灰度图像是R、G、B分量相同的⼀种特殊彩⾊图像,对计算机来说,⼀个像素点的变化范围只有0-255这256种
使⽤到的特征分类器
Haar特征分类器,其实就是⼀个XML⽂件,⽤于描述⼈体各个部位的Haar特征值(眼睛,嘴唇等)
引⽤⼀个博客的说法:
Haar特征是⼀种反映图像的灰度变化的,像素分模块求差值的⼀种特征。它分为三类:边缘特征、线性特征、中⼼特征和对⾓线特征。⽤⿊⽩两种矩形框组合成特征模板,在特征模板内⽤ ⿊⾊矩形像素和 减去 ⽩⾊矩形像素和来表⽰这个模版的特征值。例如:脸部的⼀些特征能由矩形模块差值特征简单的描述,如:眼睛要⽐脸颊颜⾊要深,⿐梁两侧⽐⿐梁颜⾊要深,嘴巴⽐周围颜⾊要深等。但矩形特
征只对⼀些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定⽅向(⽔平、垂直、对⾓)上有明显像素模块梯度变化的图像结构。
在安装⽬录可以到分类器⽂件,从⽂件名就能⼤致看出其功能
#detectMultiScale函数可以检测处图⽚中的所有⼈脸  ( 识别图像中的⼈脸,返回所有⼈脸的矩形框向量组 )
#且可以使⽤向量(vector)将所有⼈脸的坐标⼤⼩(矩形表⽰)保存
# scaleFactor 为了检测到不同⼤⼩的⽬标,通过scalefactor参数把图像长宽同时按照⼀定⽐例(默认1.1)逐步缩⼩,
# 然后检测,这个参数设置的越⼤,计算速度越快,但可能会错过了某个⼤⼩的⼈脸。
# minNeighbors 构成检测⽬标的相邻矩形的最⼩个数,默认值是3
faces = haar_face_cascade.detectMultiScale(gray_img, scaleFactor=1.1,minNeighbors=3)
image:它是要在其上绘制矩形的图像。
start_point:它是矩形的起始坐标。坐标表⽰为两个值的元组,即(X坐标值,Y坐标值)。
end_point:它是矩形的结束坐标。坐标表⽰为两个值的元组,即(X坐标值ÿ坐标值)。
color:它是要绘制的矩形的边界线的颜⾊。对于BGR,我们通过⼀个元组。例如:(255,0,0)为蓝⾊。
thickness:它是矩形边框线的粗细像素。厚度-1像素将以指定的颜⾊填充矩形形状
静态检测代码
import cv2
import numpy as np
def dection(imagepath):
image = cv2.imread(imagepath,cv2.IMREAD_COLOR) #读取图⽚
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#图像灰度化,⽤于简化矩阵运算
face_cascade = cv2.CascadeClassifier('haarcascade_l')  # xml来源于资源⽂件。
faces = face_cascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=1)
for (x , y, w, h) in faces:
image = angle(image, (x, y) , (x+w , y+h) , (0,0,255) , 2)
cv2.namedWindow('face')
cv2.imshow('face',image)
cv2.waitKey(0)  #等待退出键
cv2.destroyAllWindows()
dection('img2.jpg')
⽤摄像头做检测(此时仍然是简单的检测,并⾮识别,⼤抵上只是将图像源换为了摄像头的图像帧)
.pgm格式
Portable Gray Map
灰度图像格式中⼀种最简单的格式标准。另外两种与之相近的图⽚格式是PBM和PPM。它们分别相应着⿊⽩图像和彩⾊图像
read()函数返回⼀个bool类型,表⽰帧的读取的正确与否(可以⽤来检查视频⽂件是否到达结尾)
(read之前可以使⽤isOpened()来检测是否成功初始化摄像头)
如果初始化false,则使⽤open()
read():
参数ret 为True 或者False,代表有没有读取到图⽚第⼆个参数frame表⽰截取到⼀帧的图⽚
⽤⼀个死循环⼀直读取摄像头帧,每读到⼀帧就检测⼀次
import cv2
import numpy as np
def det(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
face_detector = cv2.CascadeClassifier("haarcascade_l")
faces = face_detector.detectMultiScale(gray, 1.2, 6)
for x, y, w, h in faces:
cv2.imshow("result", image)
#视频检测⼈脸
def video_detc():
camera = cv2.VideoCapture(1)#打开摄像头(插⼊usb摄像头后,0为笔记本摄像头,1为usb摄像头)
while(True):
ret, frame = ad()
frame = cv2.flip(frame, 1)#设置个镜像(好看⼀点)
det(frame)
c = cv2.waitKey(10)
if c == 27: # ESC
break
video_detc()
⼈脸识别数据集的录⼊
使⽤pgm格式存储
让⽤户⾃⼰输⼊id(⽤于修改⽂件名,区分不同⼈的数据集)
例如某⼀个⼈录⼊的pgm⽂件名全为:User_1.pam,1即为⽤户输⼊的id
#⼀个id(⼀个⼈)录⼊50-100张图⽚,这⾥选了100张(可能在检测的时候精度更⾼)
#并且保存为pgm格式
#需要去⼿动设置你的⼈脸id值
import cv2
import os
def input_face_data():
camera = cv2.VideoCapture(1)
#使⽤默认⼤⼩
face_detector = cv2.CascadeClassifier("haarcascade_l")
id = input("请输⼊id,并回车:")
print("请正视摄像头,多做⼏个表情")
pic_count = 0 #记录有多少pgm⽂件
while(True):
ret,frame = ad()
frame = cv2.flip(frame, 1)  # 设置个镜像(好看⼀点)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.2, 6)
for (x,y,w,h) in faces:
pic_count+=1
cv2.imwrite("D:\\py_study\\facedetection\\dataset\\User_"+str(id)+"_"+str(pic_count)+".pgm",gray[y:y+h,x:x+w])            cv2.imshow('image', frame)
print("录⼊第"+str(pic_count)+"张结束")
k = cv2.waitKey(100) & 0xff  # Press 'ESC' for exiting video
c = cv2.waitKey(10)
if c == 27:  # ESC
break
elif pic_count>=100:
print("结束录⼊数据集")
break
input_face_data()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。