重要的事写在前面:程序可运行程序可运行程序可运行,完整代码及数据见Github仓库

文章目录

  • 环境
  • 准备训练数据
  • 识别器的训练
  • 预测
  • Reference

环境

  1. Python3安装
  2. OpenCV库安装
    在cmd中输入pip install opencv-contrib-python,如果显示pip不是内部或外部命令,那就是未配置环境变量,自行百度。
  3. Numpy库安装
    在cmd中输入pip install numpy
  4. OpenCV人脸识别器下载,链接
    这里我选择的是LBPH人脸识别器,他能很好的避免光线明暗的影响

准备训练数据

这里我们在网上搜集了20多张有关小孩情绪的照片(精力有限,只作简单的学习),将其手动标记为happysad两种标签,照片命名规则为[标签][number].jpg。
将照片分为训练数据和测试数据,分别放在img_trainimg_predict文件夹下。
所以我们的目录结构是这样的
– img_train
     – happy1.jpg
     – happy2.jpg
     – …
     – sad1.jpg
     – sad2.jpg
     – …
– img_predict
     – happy1.jpg
     – sad1.jpg
准备工作已经做好了,接下来我们可以开始编写代码了,这里我将代码分成了6个源文件
源文件detect_face.py

import cv2def detect_face(img):#将图像转变成灰度图像,因为OpenCV人脸检测器需要灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BAYER_BG2GRAY)#加载OpenCV人脸识别器,注意这里的路径是前面下载识别器时,你保存的位置face_cascade = cv2.CascadeClassifier(r'D:\matlab\matlab\toolbox\vision\visionutilities\classifierdata\cascade\lbp\lbpcascade_frontalface.xml')#scaleFactor表示每次图像尺寸减小的比例,minNeighbors表示构成检测目标的相邻矩形的最小个数#这里选择图像尺寸减小1.2倍。minNeighbors越大,识别出来的人脸越准确,但也极易漏判faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=1)# 如果图中没有人脸,该图片不参与训练,返回Noneif len(faces) == 0:return None, None# 提取面部区域(x, y, w, h) = faces[0]#返回人脸及其所在区域return gray[y:y + w, x:x + h], faces[0]

detect_face.py文件中定义了函数detect_face,它能提取输入图像的人脸及其位置。

源文件prepare_training_data.py

import os#引入刚刚编写好的源文件
from detect_face import detect_face
import cv2def prepare_training_data():#读取训练文件夹中的图片名称dirs = os.listdir(r'./img_train')faces = []labels = []for image_path in dirs:#如果图片的名称以happy开头,则标签为1l;sad开头,标签为2if image_path[0] == 'h':label = 1else:label = 2#得到图片路径image_path = './img_train/' + image_path#返回灰度图,返回Mat对象image = cv2.imread(image_path,0)#以窗口形式显示图像,显示100毫秒cv2.imshow("Training on image...", image)cv2.waitKey(100)#调用我们先前写的函数face, rect = detect_face(image)if face is not None:faces.append(face)labels.append(label)cv2.destroyAllWindows()cv2.waitKey(1)cv2.destroyAllWindows()return faces, labels

目前为止,我们对图片的预处理已经做好了!

识别器的训练

函数cv2.face.LBPHFaceRecognizer_create()将返回一个局部二值模式直方图(LBPH)人脸识别器
我们可以开始写源文件main.py

from prepare_training_data import prepare_training_data
import cv2
import numpy as np
#该文件我们稍后编写
from predict import predictif __name__ == '__main__':print("Preparing data...")#调用之前写的函数,得到包含多个人脸矩阵的序列和它们对于的标签faces, labels = prepare_training_data()print("Data prepared")print("Total faces: ", len(faces))print("Total labels: ", len(labels))#得到(LBPH)人脸识别器face_recognizer = cv2.face.LBPHFaceRecognizer_create()#应用数据,进行训练face_recognizer.train(faces, np.array(labels))print("Predicting images...")# 加载预测图像,这里我图简单,就直接把路径写上去了test_img1 = cv2.imread(r"./img_predict/happy1.jpg",0)test_img2 = cv2.imread(r"./img_predict/sad1.jpg",0)# 进行预测# 注意,该函数我们还未编写!!!predicted_img1 = predict(test_img1, face_recognizer)predicted_img2 = predict(test_img2, face_recognizer)print("Prediction complete")# 显示预测结果cv2.imshow('Happy', predicted_img1)cv2.imshow('Sad', predicted_img2)cv2.waitKey(0)cv2.destroyAllWindows()

相信到目前为止你已经对opencv的识别过程有了个清晰的认识,接下来我们将编写predict函数。

预测

源文件predict.py

from detect_face import detect_face# 这两个文件我们还未编写
from draw_rectangle import draw_rectangle
from draw_text import draw_textdef predict(test_img, face_recognizer):# 将标签1,2转换成文字subjects = ['', 'Happy', 'Sad']# 得到图像副本img = test_img.copy()# 从图像中检测脸部face, rect = detect_face(img)# 使用我们的脸部识别器预测图像label = face_recognizer.predict(face)# 获取由人脸识别器返回的相应标签的名称label_text = subjects[label[0]]# 注意,下面两个函数我们还未编写!!!# 在检测到的脸部周围画一个矩形draw_rectangle(img, rect)# 在矩形周围标出人脸情绪draw_text(img, label_text, rect[0], rect[1] - 5)return img

程序的主要部分我们已经完成,还差draw_rectangle,和draw_text两个函数,我们将其完成:

源文件draw_rectangle.py

import cv2def draw_rectangle(img, rect):(x, y, w, h) = rectcv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

源文件draw_text.py

import cv2def draw_text(img, text, x, y):cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0), 2)

大功告成!接下来我们运行main.py,得到识别结果:

可以看到识别结果还不错,如果增加训练集应该能训练出一个不错的情绪识别器。

Reference

  1. https://www.cnblogs.com/zhuifeng-mayi/p/9171383.html?tdsourcetag=s_pctim_aiomsg
  2. https://blog.csdn.net/firstlai/article/details/70882240
  3. https://blog.csdn.net/Young__Fan/article/details/80022860
  4. http://blog.sina.com.cn/s/blog_9fcb9cbb01012b5b.html
  5. https://blog.csdn.net/weixin_42309501/article/details/80781293

OpenCV情绪识别(Python实现,超简单)相关推荐

  1. 【项目】新冠肺炎疫情期间网民情绪识别——Python文本分类

    目录 任务描述 数据描述 读取数据 数据预处理 可视化 word2vec 模型框架及拟合 结果展示 改进与思考 说明 任务描述 2019新型冠状病毒(COVID-19)感染的肺炎疫情发生对人们生活生产 ...

  2. excel调用python编程-超简单:用Python让Excel飞起

    本书对于编程知识零基础的办公人士特别友好,其摒弃了晦涩的理论讲解,引入了实用的办公场景,为办公人士开辟了一条学习办公自动化的新路.本书精选典型办公案例以及通俗易懂的讲解,有助于办公人士掌握Python ...

  3. [转载] excel调用python编程-超简单:用Python让Excel飞起

    参考链接: Python | 使用XlsxWriter模块在Excel工作表中绘制饼图 本书对于编程知识零基础的办公人士特别友好,其摒弃了晦涩的理论讲解,引入了实用的办公场景,为办公人士开辟了一条学习 ...

  4. Python实现超简单【抖音】无水印视频批量下载

    导读:本文介绍了如何使用简单的Python爬虫爬取抖音上你喜欢的拍客的所有视频(包含有水印和无水印两种).代码已上传至公众号后台,回复:抖音 即可获得. 01 获取你喜欢的拍客的视频url 即抖音用户 ...

  5. opencv人脸识别(python)

    先上几个cv2模块的函数 1.读取保存图片 import cv2 as cv img=cv.imread("img.jpg") cv.imshow("read" ...

  6. 小白也学得会!Python编程超简单方法算圆周率

    我们都知道,圆周率是3.1415926也就是π,但你有没有想过,圆周率是怎么算出来的呢? 这个是德国数学家莱布尼兹发明的算圆周率的方法,公式为:π=4(1-1/3+1/5+1/7+1/9-1/11-- ...

  7. 【Python】超简单的华容道小游戏制作+保姆级讲解(附源码)

    前言 华容道游戏是一个历史悠久的经典游戏,玩法就是将已经打乱的数字重新调整顺序,使其成为正序排列 正好昨天一个朋友的python老师留下了这道华容道的题目,今天就来学习一下吧 注意!!! 以下内容不包 ...

  8. 在python中超简单安装mxnet_在Docker容器中搭建MXNet/Gluon开发环境

    在这篇文章中没有直接使用MXNet官方提供的docker image,而是从一个干净的nvidia/cuda镜像开始,一步一步部署mxnet需要的相关软件环境,这样做是为了更加细致的了解mxnet的运 ...

  9. 「Python」超简单!Python返回矩阵最大元素/最小值坐标,三行搞定!(更新:一行搞定!)

    更新 使用np.unravel_index()函数: np.unravel_index(A.argmax(), A.shape) # (2, 2) 原理同下 --------------------- ...

  10. python做视频特效_python实现超简单的视频对象提取功能

    视频对象提取 与其说是视频对象提取,不如说是视频颜色提取,因为其本质还是使用了OpenCV的HSV颜色物体检测.下面话不多说了,来一起看看详细的介绍吧. HSV介绍 HSV分别代表,色调(H:hue) ...

最新文章

  1. UCloud全年营收 11.9 亿元,净利润 7715 万元
  2. C语言初学者代码中的常见错误与瑕疵(2)
  3. [转]24岁到26岁 奔三的尴尬年纪,你要知道的50件事
  4. (原創) 如何讓Linux開機時,不要在圖形介面顯示開機訊息? (OS) (Linux) (CentOS)
  5. Android开发工具之Android Studio---如何打JAR包
  6. 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard)
  7. IndentationError: expected an indented block --python报错 or IndentationError:unexpected indent
  8. 福建二级计算机考试12,福建农林大学2016年12月计算机二级考试通知
  9. 微信小程序启动、更新机制
  10. 实战NSURLProtocol 拦截 APP网络请求NSURLConnection, NSURLSession, Alamofire
  11. HTB-oscplike-Bounty+Jerry+Conceal
  12. c语言程序代码分享,一些简单的C语言程序代码(最新整理)
  13. 超宽带 DWM1000模块 引脚连接
  14. 如何关闭445端口 两种方式教你关闭445端口
  15. 安卓(Android) 刷机教程(任何机型、小米、华为等等)
  16. 含有使字的诗句_带有一字的诗句
  17. 第十章 项目沟通管理和干系人管理
  18. 获取当前系统时间(取相对于系统时间的前一周时间)
  19. 微信公众号历史数据采集和推文监控
  20. JGG近期专刊征稿汇总|时空组学、人体微生物组、人类遗传病、小麦生物学

热门文章

  1. python求派_python求π
  2. 8.绘制统计图形——直方图
  3. /Volumes/TeXLive2019/install-tl: No binary platform specified/available, quitting.
  4. iOS开发之定位神器-超简单方式解决iOS后台定时定位
  5. Wim技术之Wim文件的制作
  6. 汽车数据流分析常采用哪些方法?
  7. SWP文件详细介绍与利用
  8. Android性能优化 -- 自启动管理
  9. 团队管理31-典型场景(向上沟通)
  10. CodeForces 1305C-Kuroni and Impossible Calculation(抽屉原理)