OpenCV基于Haar人脸检测和眼睛检测攻略
OpenCV是一个功能强大的开源计算机视觉库,可以用于图像和视频处理。其中,基于Haar特征的人脸检测和眼睛检测是OpenCV中的一个经典应用,本文将介绍这一应用的完整攻略。
步骤1:安装OpenCV
首先,我们需要在本地电脑上安装OpenCV库。具体可参考OpenCV官网的安装教程:https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html
步骤2:收集训练数据
在进行人脸检测和眼睛检测之前,我们需要使用大量的训练数据来训练Haar分类器。训练数据可以是正样本和负样本的集合,其中正样本是包含人脸和眼睛的图像,负样本则是一些随机的图像,不包含人脸和眼睛。
我们可以从国际上公开的数据集中下载训练数据。例如:LFW数据集、WIDER FACE数据集、FDDB数据集等。
步骤3:训练Haar分类器
OpenCV提供了一个名为Cascade Trainer GUI的工具,可以用于训练Haar分类器。 使用该工具时,需要为训练数据设置标签,并指定Haar特征、正负样本的数量等相关参数。可以在命令行中运行以下命令来打开该工具:
opencv_createsamples -info your_path/info.txt -num 1000 -w 48 -h 48 -vec your_path/your_samples.vec
opencv_traincascade -data your_path -vec your_path/your_samples.vec -bg your_path/bg.txt -numPos 1000 -numNeg 500 -numStages 20 -w 24 -h 24
这个命令会先用正样本生成vec文件,然后用vec数据和负样本,开始训练Harr分类器,经过N个阶段的训练后,最终生成xml文件,即为完成训练。
步骤4:使用Haar分类器进行人脸检测和眼睛检测
通过使用OpenCV中的Haar分类器,可以在输入图像或视频中进行实时人脸和眼睛检测。下面是基于Python和OpenCV的代码实现示例:
import cv2
# 加载训练好的Haar分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
# 读取图像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行人脸检测
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=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]
# 对于每张人脸,进行眼睛检测
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)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例1:在视频中实时检测人脸和眼睛
import cv2
# 加载训练好的Haar分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
# 处理视频
cap = cv2.VideoCapture(0)
while True:
# 读取帧
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行人脸检测
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=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]
# 对于每张人脸,进行眼睛检测
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)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
示例2:从摄像头中捕获图片并进行人脸和眼睛检测
import cv2
# 加载训练好的Haar分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
# 处理摄像头捕捉的图片
cap = cv2.VideoCapture(0)
ret, img = cap.read()
cv2.imwrite("capture.jpg", img)
cap.release()
# 读取图片,并进行人脸检测
img = cv2.imread('capture.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=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]
# 对于每张人脸,进行眼睛检测
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)
cv2.waitKey(0)
cv2.destroyAllWindows()
以上示例代码可以在Python环境下运行,并基于OpenCV进行实时人脸和眼睛检测,可以根据需要进行参考和修改。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:opencv基于Haar人脸检测和眼睛检测 - Python技术站