基于OpenCV的人脸检测软件(含Python源码+UI界面+图文详解)
发布人:shili8
发布时间:2023-05-22 14:34
阅读次数:231
人脸检测是计算机视觉领域中的一个重要应用,它可以在图像或视频中自动识别出人脸,并进行分析和处理。OpenCV是一个开源的计算机视觉库,它提供了许多用于人脸检测的函数和算法。本文将介绍基于OpenCV的人脸检测软件,包括Python源码、UI界面和图文详解。
一、软件介绍
本软件基于Python语言和OpenCV库开发,可以实现对图像或视频中的人脸进行检测和识别。软件界面简洁明了,操作简单易懂,适合初学者学习和使用。
二、软件功能
1. 图像人脸检测:可以对单张图片进行人脸检测,并在图像中标出人脸位置。
2. 视频人脸检测:可以对视频进行实时人脸检测,并在视频中标出人脸位置。
3. 人脸识别:可以对已知人脸进行识别,并在图像或视频中标出人脸位置和姓名。
三、软件界面
软件界面如下图所示:
:
def __init__(self):
super().__init__()
self.initUI()
3. 初始化UI界面
def initUI(self):
self.setWindowTitle(人脸检测软件)
self.setGeometry(100 100 800 600)
# 创建菜单栏
menubar = self.menuBar()
fileMenu = menubar.addMenu(文件)
openAction = fileMenu.addAction(打开)
openAction.triggered.connect(self.openFile)
# 创建工具栏
toolbar = self.addToolBar(工具栏)
imageButton = toolbar.addAction(图像检测)
videoButton = toolbar.addAction(视频检测)
faceButton = toolbar.addAction(人脸识别)
imageButton.triggered.connect(self.imageDetect)
videoButton.triggered.connect(self.videoDetect)
faceButton.triggered.connect(self.faceRecognize)
# 创建状态栏
self.statusBar().showMessage(就绪)
# 创建显示区域
self.label = QLabel()
self.label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(self.label)
4. 打开文件
def openFile(self):
fileName _ = QFileDialog.getOpenFileName(self 打开文件 Images (*.png *.xpm *.jpg *.bmp);;Videos (*.mp4 *.avi))
if fileName:
self.fileName = fileName
self.statusBar().showMessage(已打开文件: + fileName)
self.showImage(fileName)
5. 显示图像
def showImage(self fileName):
img = cv2.imread(fileName)
img = cv2.cvtColor(img cv2.COLOR_BGR2RGB)
h w c = img.shape
if h > 500 or w > 700:
img = cv2.resize(img (700 500))
qImg = QImage(img.data w h w * c QImage.Format_RGB888)
pixmap = QPixmap.fromImage(qImg)
self.label.setPixmap(pixmap)
6. 图像检测
def imageDetect(self):
if not hasattr(self fileName):
QMessageBox.warning(self 警告 请先打开文件!)
return
face_cascade = cv2.CascadeClassifier(haarcascade_frontalface_default.xml)
img = cv2.imread(self.fileName)
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) (0 255 0) 2)
img = cv2.cvtColor(img cv2.COLOR_BGR2RGB)
h w c = img.shape
if h > 500 or w > 700:
img = cv2.resize(img (700 500))
qImg = QImage(img.data w h w * c QImage.Format_RGB888)
pixmap = QPixmap.fromImage(qImg)
self.label.setPixmap(pixmap)
7. 视频检测
def videoDetect(self):
if not hasattr(self fileName):
QMessageBox.warning(self 警告 请先打开文件!)
return
face_cascade = cv2.CascadeClassifier(haarcascade_frontalface_default.xml)
cap = cv2.VideoCapture(self.fileName)
while cap.isOpened():
ret frame = cap.read()
if ret:
gray = cv2.cvtColor(frame cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray 1.3 5)
for (x y w h) in faces:
cv2.rectangle(frame (x y) (x + w y + h) (0 255 0) 2)
frame = cv2.cvtColor(frame cv2.COLOR_BGR2RGB)
h w c = frame.shape
if h > 500 or w > 700:
frame = cv2.resize(frame (700 500))
qImg = QImage(frame.data w h w * c QImage.Format_RGB888)
pixmap = QPixmap.fromImage(qImg)
self.label.setPixmap(pixmap)
QApplication.processEvents()
else:
break
cap.release()
8. 人脸识别
def faceRecognize(self):
if not hasattr(self fileName):
QMessageBox.warning(self 警告 请先打开文件!)
return
face_cascade = cv2.CascadeClassifier(haarcascade_frontalface_default.xml)
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read(trainer.yml)
labels = {}
with open(labels.txt r) as f:
lines = f.readlines()
for line in lines:
label name = line.strip().split(:)
labels[int(label)] = name
cap = cv2.VideoCapture(self.fileName)
while cap.isOpened():
ret frame = cap.read()
if ret:
gray = cv2.cvtColor(frame cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray 1.3 5)
for (x y w h) in faces:
roi_gray = gray[y:y + h x:x + w]
roi_color = frame[y:y + h x:x + w]
id_ conf = recognizer.predict(roi_gray)
if conf >= 45 and conf <= 85:
name = labels[id_]
cv2.putText(frame name (x y - 10) cv2.FONT_HERSHEY_SIMPLEX 1 (0 255 0) 2 cv2.LINE_AA)
cv2.rectangle(frame (x y) (x + w y + h) (0 255 0) 2)
frame = cv2.cvtColor(frame cv2.COLOR_BGR2RGB)
h w c = frame.shape
if h > 500 or w > 700:
frame = cv2.resize(frame (700 500))
qImg = QImage(frame.data w h w * c QImage.Format_RGB888)
pixmap = QPixmap.fromImage(qImg)
self.label.setPixmap(pixmap)
QApplication.processEvents()
else:
break
cap.release()
五、代码注释
1. 导入库文件

