基于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. 导入库文件