当前位置:实例文章 » Python实例» [文章]基于OpenCV的人脸检测软件(含Python源码+UI界面+图文详解)

基于OpenCV的人脸检测软件(含Python源码+UI界面+图文详解)

发布人:shili8 发布时间:2023-05-22 14:34 阅读次数:231

人脸检测是计算机视觉领域中的一个重要应用,它可以在图像或视频中自动识别出人脸,并进行分析和处理。OpenCV是一个开源的计算机视觉库,它提供了许多用于人脸检测的函数和算法。本文将介绍基于OpenCV的人脸检测软件,包括Python源码、UI界面和图文详解。

一、软件介绍

本软件基于Python语言和OpenCV库开发,可以实现对图像或视频中的人脸进行检测和识别。软件界面简洁明了,操作简单易懂,适合初学者学习和使用。

二、软件功能

1. 图像人脸检测:可以对单张图片进行人脸检测,并在图像中标出人脸位置。

2. 视频人脸检测:可以对视频进行实时人脸检测,并在视频中标出人脸位置。

3. 人脸识别:可以对已知人脸进行识别,并在图像或视频中标出人脸位置和姓名。

三、软件界面

软件界面如下图所示:

![软件界面]( />
软件界面分为三个部分:

1. 左侧为图像或视频显示区域,可以显示待检测的图像或视频。

2. 中间为功能选择区域,可以选择进行图像或视频人脸检测,或进行人脸识别。

3. 右侧为结果显示区域,可以显示检测或识别结果。

四、Python源码

1. 导入库文件

import cv2
import numpy as np
import os
import sys
from PyQt5.QtWidgets import QApplication QMainWindow QFileDialog QMessageBox
from PyQt5.QtGui import QPixmap QImage
from PyQt5.QtCore import Qt QTimer


2. 定义主窗口类

class MainWindow(QMainWindow):
    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. 导入库文件

相关标签:源码
其他信息

其他资源

Top