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键来关闭程序。
