目录
一、前言
①本篇将给出图片和视频的例程,所以无摄像头也可复现学习
②树莓派需先预装好opencv以及numpy,安装步骤有许多教程可供参考,本文不再赘述
③博主使用的系统为64位树莓派系统、python版本为3.11.2、opencv版本为4.6.0、numpy的
版本为1.24.2
④完整代码在文末贴出,以供学习
⑤完整工程在文末贴出,可使用U盘拷贝置树莓派直接运行学习
二、详细步骤讲解
1、导入必要的库:numpy
用于数值计算,cv2
用于计算机视觉操作
import numpy as np
import cv2
2、加载已训练好的开源的级联分类器文件,加载图片或视频流
#加载级联分类器文件
face_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_eye.xml')
#图片读取及大小处理
image = cv2.imread('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/lc.jpg', 33)
img = cv2.resize(image, (800, 800)) #将加载的图像调整为800x800的尺寸
注意:
分类级联器也放在文末
若要复现项目需修改分类级联器和图片的文件路径,路径必须为绝对路径,否则会报错
3、人脸识别详解
while 1:
# 将图像从BGR色彩空间转换为灰度图像,以便更容易进行人脸检测。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用人脸检测分类器在灰度图像中检测人脸。参数1.3为缩放系数,5为最小邻居数(越高越严格)。
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 对检测到的每张人脸的坐标(x, y, w, h)进行遍历。
for (x,y,w,h) in faces:
# 在原始彩色图像中,在每张检测到的人脸周围绘制一个蓝色的矩形框。
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 从灰度图像和原始彩色图像中截取出人脸区域的子图像,分别用于进一步处理(例如眼睛检测)。
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
# 打印人脸矩形框中心的坐标。
print (int(x+w/2), int(y+h/2))
# 在人脸区域的灰度图像中检测眼睛。
eyes = eye_cascade.detectMultiScale(roi_gray)
# 对每个检测到的眼睛的坐标(ex, ey, ew, eh)进行遍历。
for (ex,ey,ew,eh) in eyes:
# 在原始彩色图像的人脸区域内,在检测到的每只眼睛周围绘制一个绿色矩形框。
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
# cv2.imshow('img',img)显示处理后的图像,窗口名称为img。
cv2.imshow('img',img)
# 按下q键,退出循环并结束程序。
key=cv2.waitKey(1)
if key&0XFF==ord('q'):
break
cv2.destroyAllWindows()
三、运行结果
感谢舍友提供图片素材!由运行结果可以看出人脸检测非常成功,但是没有识别出人眼,原因如下:
被识别图像需要较为稍微标准一些的人脸 ,或可以适当降低一些识别的严格系数
四、完整代码贴出
1、图片人脸识别
import numpy as np
import cv2
#加载级联分类器文件
face_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_eye.xml')
#图片读取及大小处理
image = cv2.imread('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/lc.jpg', 33)
img = cv2.resize(image, (800, 800)) #将加载的图像调整为800x800的尺寸
while 1:
# 将图像从BGR色彩空间转换为灰度图像,以便更容易进行人脸检测。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用人脸检测分类器在灰度图像中检测人脸。参数1.3为缩放系数,5为最小邻居数(越高越严格)。
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 对检测到的每张人脸的坐标(x, y, w, h)进行遍历。
for (x,y,w,h) in faces:
# 在原始彩色图像中,在每张检测到的人脸周围绘制一个蓝色的矩形框。
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 从灰度图像和原始彩色图像中截取出人脸区域的子图像,分别用于进一步处理(例如眼睛检测)。
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
# 打印人脸矩形框中心的坐标。
print (int(x+w/2), int(y+h/2))
# 在人脸区域的灰度图像中检测眼睛。
eyes = eye_cascade.detectMultiScale(roi_gray)
# 对每个检测到的眼睛的坐标(ex, ey, ew, eh)进行遍历。
for (ex,ey,ew,eh) in eyes:
# 在原始彩色图像的人脸区域内,在检测到的每只眼睛周围绘制一个绿色矩形框。
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
# cv2.imshow('img',img)显示处理后的图像,窗口名称为img。
cv2.imshow('img',img)
# 按下q键,退出循环并结束程序。
key=cv2.waitKey(1)
if key&0XFF==ord('q'):
break
cv2.destroyAllWindows()
2、视频人脸识别
import numpy as np
import cv2
#加载级联分类器文件
face_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('/home/raspberry4B/Desktop/MyOpenCV/2.2face_recognition/haarcascade_eye.xml')
cap = cv2.VideoCapture(0)
while 1:
ret, img = cap.read()
img = cv2.flip(img,1) # 摄像头传入的图片是水平相反的,所以要镜像对称一次
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
print (int(x+w/2), int(y+h/2))
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv2.imshow('img',img)
# 按下q键,退出循环并结束程序。
key=cv2.waitKey(1)
if key&0XFF==ord('q'):
break
cap.release()
cv2.destroyAllWindows()