Python基于pyopencv人脸识别并绘制GUI界面

  

下面我将详细介绍"Python基于pyopencv人脸识别并绘制GUI界面"的完整攻略。

一、前置知识

在进行人脸识别和GUI界面绘制之前,需要先掌握以下知识点:

  • Python编程语言基础
  • OpenCV库(用于图像处理和计算机视觉)
  • PyQt5库(用于GUI界面绘制)

二、安装必要库

在进行Python基于pyopencv的人脸识别和GUI界面绘制之前,需要安装以下库:

1. Python3

可以在Python官网下载 https://www.python.org/downloads/

2. OpenCV

可以使用以下指令进行安装:

pip install opencv-python

3. PyQt5

可以使用以下指令进行安装:

pip install pyqt5

三、人脸识别

1. 导入必要库

import numpy as np
import cv2

2. 加载人脸识别模型

可以使用OpenCV提供的已经训练好的人脸识别模型进行识别。可以下载文件haarcascade_frontalface_default.xml,然后加载为OpenCV的分类器模型。

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

3. 读取图像文件

可以使用cv2.imread()函数读取本地图像文件,也可以通过opencv的摄像头打开实时图像。

如果需要使用已有的图像文件,可以使用以下代码:

img = cv2.imread('img.jpg')

4. 进行人脸识别

人脸识别通常是通过对图像进行特征提取,然后使用分类器进行识别。在OpenCV中,可以使用detectMultiScale()方法进行人脸检测。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

其中,cv2.cvtColor()函数将图像转换为灰度图像,这样用于人脸检测时更方便。faces包含检测到的人脸区域坐标。

5. 绘制人脸区域

可以使用cv2.rectangle()函数在图像中绘制人脸区域。

for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

其中,(x,y)为人脸区域的左上角坐标,(w,h)表示人脸区域的宽度和高度,(255,0,0)是绘制矩形框的颜色,2是矩形框的粗细。

6. 显示图像

可以使用cv2.imshow()函数显示绘制好的图像。

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,'img'表示窗口标题,0表示按任意键即可关闭窗口。

四、GUI界面绘制

1. 导入必要库

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon

2. 创建GUI应用

可以通过继承QWidget类来创建一个GUI应用程序。

class MyApp(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('My App')
        self.show()

其中,setGeometry()方法用于设置窗口的位置和大小,setWindowTitle()方法设置窗口标题,show()方法显示应用程序。

3. 运行应用

创建GUI应用程序之后,需要通过QApplication类来执行应用。

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

其中,sys.argv是一个字符串列表,表示命令行参数,可以用于从命令行中启动应用程序。

五、将人脸识别与GUI界面结合

可以将上述两部分代码结合起来,实现一个能够对图像进行人脸识别并绘制GUI界面的应用程序。

下面是一个示例代码:

import sys
import numpy as np
import cv2
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QFileDialog

class MyApp(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 280, 150)
        self.setWindowTitle('人脸识别')

        self.label = QLabel(self)
        self.label.move(10,10)
        self.label.resize(250, 130)
        self.label.setText('请点击打开图像文件')

        self.statusBar().showMessage('请点击打开图像文件')
        self.show()

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "选择图像文件", "", "图像文件 (*.jpg *.png)")
        self.statusBar().showMessage('正在处理,请稍候...')
        if fileName:
            img = cv2.imread(fileName)
            face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            faces = face_cascade.detectMultiScale(gray, 1.3, 5)
            for (x,y,w,h) in faces:
                img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
            cv2.imwrite('result.jpg', img)
            pixmap = QPixmap('result.jpg')
            self.label.setPixmap(pixmap)
            self.label.setScaledContents(True)
            self.statusBar().showMessage('处理完成')

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MyApp()

    ex.label.mousePressEvent = ex.openFile

    sys.exit(app.exec_())

以上代码运行后,点击“请点击打开图像文件”链接,选择一张图片,程序会自动识别出其中的人脸并在GUI应用中显示出来。可以在窗口中查看具体的处理结果。

另一个示例是在GUI应用中添加预览摄像头的功能。可以参考以下代码:

import sys
import numpy as np
import cv2
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QFileDialog

class MyApp(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

        self.timer = QTimer()
        self.timer.timeout.connect(self.show_camera)
        self.timer.start(30)

        self.cap = cv2.VideoCapture(0)

    def initUI(self):

        self.setGeometry(300, 300, 480, 360)
        self.setWindowTitle('人脸识别')

        self.label = QLabel(self)
        self.label.move(10,10)
        self.label.resize(460, 340)

        self.statusBar().showMessage('摄像头已启动')
        self.show()

    def show_camera(self):
        ret, img = self.cap.read()
        face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)
        for (x,y,w,h) in faces:
            img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        cv2.imshow('camera', img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            self.statusBar().showMessage('摄像头已关闭')
            self.cap.release()
            cv2.destroyAllWindows()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MyApp()

    sys.exit(app.exec_())

以上代码运行后,程序会打开摄像头进行实时预览,并在检测到人脸时将其用矩形框标记出来。用户可以按下q键来关闭程序。

相关文章