下面我将详细介绍"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键来关闭程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python基于pyopencv人脸识别并绘制GUI界面 - Python技术站