OpenCV图像处理——人脸表情识别
第一节 研究内容及背景
本设计要实现的内容是对人脸的表情(高兴、生气(愤怒)、悲伤)等进行识别,该功能的应用有人机交互应用、通信系统应用、娱乐游戏应用、智能医疗应用等等。计算机在我们的日常生活中运用广泛,当前人机交互的发展的方向是更加智能和友好,比如可以根据人脸的表情做出相对应的反应;通信领域的应用则主要是在传输过程中通过计算机对人脸的表情进行分类,提取出有用的信息,然后在接收端进行重新组合,节省宽带的占用和在网络环境较差时,能够进行传输;在娱乐游戏中的运用则主要是根据人脸的表情变化,做出相对应的反应,从而达到更好的娱乐效果;智能医疗的应用是在治疗的过程中,对严重患者的表情进行判断,从而达到了解病人的痛苦程度,进行相对应的治疗,以减轻患者的病痛情况。
第二节 实现方法
2.1 实现方法分析
人脸表情识别中需要运用人脸检测技术,识别人脸之后,再对表情图像做预处理(彩色图像灰度化、图像几何归一化和光照预处理),然后再对表情特征进行提取,分析,从而实现对表情的识别。国内外对于人脸的表情识别的研究近几年非常的多,涌现出了很多的算法,但对于表情的识别精度还是有待改进。
2.2 采用的方法/算法
本设计报告采用人脸检测技术,并进行标记,图像灰度化,图像几何归一化等方法,通过提取出嘴巴,眼睛两个地方的大小变化进行判断,识别精度较低,有待后续的改进与完善。
第3节 实现步骤
首先,对人脸、嘴巴和眼睛进行检测、识别和标记,对图像进行灰度化,归一化处理(如图3-1所示)
实现的效果:高兴(如图3-2所示);
生气、愤怒(如图3-3所示);
悲伤(如图3-4所示)
第四节 源代码
#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>#include <stdio.h>
using namespace std;using namespace cv;/** Function Headers */void detectAndDisplay( Mat frame );
/** Global variables */String face_cascade_name=
"data/haarcascade_frontalface_alt.xml";String eyes_cascade_name =
"data/haarcascade_eye_tree_eyeglasses.xml";
String mouths_cascade_name = "data/haarcascade_mcs_mouth.xml";CascadeClassifier face_cascade;CascadeClassifier eyes_cascade;CascadeClassifier mouths_cascade;string window_name = "Capture - Face detection";RNG rng(12345);
int eyedx,mouthdx;/** @function main */int main( int argc, const char** argv ){CvCapture* capture;Mat frame;cout<<"in main"<<endl;
//-- 1. Load the cascades
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
if( !mouths_cascade.load( mouths_cascade_name ) ){ printf
("—(!)Error loading\n"); return -1; };//-- 2. Read the video streamcapture = cvCaptureFromCAM( 0);-1if( capture ){cout<<"capture is ok."<<endl;while( true ){frame = cvQueryFrame( capture );//-- 3. Apply the classifier to the frameif( !frame.empty() ){
cout<<"frame is ok."<<endl;
detectAndDisplay( frame );}else{
printf(" --(!) No captured frame -- Break!"); break;
}int c = waitKey(10);if( (char)c == 'c' ){
break;
}}}return 0;}
/** @function detectAndDisplay */
void detectAndDisplay( Mat frame )
{std::vector<Rect> faces;Mat frame_gray,frame2;normalize(frame,frame2 , 0,255, NORM_MINMAX, CV_8UC3);cvtColor( frame2, frame_gray, CV_BGR2GRAY );equalizeHist( frame_gray, frame_gray );
//normalize(frame_gray,Image, 0,255, NORM_MINMAX,
//CV_8UC3);//-- Detect faces
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );for( size_t i = 0; i < faces.size(); i++ ){Point center( faces[i].x + faces[i].width*0.5,
faces[i].y + faces[i].height*0.5 );
ellipse( frame_gray, center, Size( faces[i].width*0.6, faces[i].height*0.6), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );Mat faceROI = frame_gray( faces[i] );std::vector<Rect> eyes;std::vector<Rect> mouths;eyedx=-1;//-- In each face, detect eyes
eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2,
0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );
mouths_cascade.detectMultiScale( faceROI, mouths , 1.1,
2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );for(size_t j = 0; j < eyes.size(); j++ ){
Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5,faces[i].y + eyes[j].y + eyes[j].height*0.5 );
int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
circle( frame_gray, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
//cout<<eyes[j].width<<" "<<eyes[j].height<<endl;
if(eyes[j].height>=80)
eyedx=1;
elseeyedx=0;
//if(eyes[j].height<40&&eyes[j].width>60)eyedx=-1;
//else if(radius>=40&&radius<=45)eyedx=0;
//else eyedx=1;}for( size_t z = 0; z < mouths.size(); z++ ){
Point center(faces[i].x+mouths[z].x + mouths[z].width*0.5,faces[i].y + mouths[z].y + mouths[z].height*0.5 );
if(mouths[z].y + mouths[z].height*0.5
>faces[i].height/2){ellipse( frame_gray,center,
Size(mouths[z].width*0.5,mouths[z].height*0.5)
, 0, 0, 360, Scalar( 255, 255, 255 ), 4, 8, 0 );
if(mouths[z].width>110) mouthdx=1;
else mouthdx=0;
//cout<<mouths[z].width<<" //"<<mouths[z].height<< endl;
//else //if(mouths[z].width<=80&&mouths[z].height>80) //mouthdx=-1;
//else mouthdx=0;}
}if(mouthdx==1) cout<<"happy"<<endl;
else if(eyedx==1&&mouthdx==0) cout<<"angry"<<endl;
else cout<<"sad"<<endl;}//-- Show what you gotimshow( window_name, frame_gray );}
本项目源代码:
https://github.com/ahongl/ClassicalCode/blob/master/ExpressionRecognition.cpp
OpenCV图像处理——人脸表情识别相关推荐
- Python基于OpenCV的人脸表情识别系统[源码&部署教程]
1.项目背景 人脸表情识别是模式识别中一个非常重要却十分复杂的课题.首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾.然后对近期人脸表情识别的方法进行了分类综述.通过对各种识别方法的分析与 ...
- 人脸表情识别/人脸检测/ML/DL/图像处理博主
人脸表情识别/人脸检测/ML/DL/图像处理博主 人脸表情识别/人脸检测/ML/DL/图像处理博主:https://blog.csdn.net/app_12062011/article/categor ...
- 【项目实战课】AI零基础,人人免费可学!基于Pytorch的SimpleNet人脸表情识别实战...
欢迎大家来到我们的项目实战课,本期内容是<基于SimpleNet的人脸表情识别实战>,本次内容面向任意AI基础的读者,人人皆可免费学习. 所谓项目实战课,就是以简单的原理回顾+详细的项目实 ...
- 【人脸表情识别】情绪识别相关会议、比赛汇总(2018-2020)
前面专栏中,我们介绍了有关基于图片/视频的人脸表情识别的相关内容,也了解了通过回归的方式来理解表情的方式--基于连续模型的人脸表情识别.在专栏的最后一篇文章中,我们将分享计算机视觉领域中围绕情绪识别主 ...
- 【人脸表情识别】不得不读的重要论文推荐(2019-2020篇)
上一篇专栏文章我们介绍了2015-2018年基于图片的人脸表情识别代表性方法.本文将延续上一篇的内容,继续盘点2019-2020基于图片的人脸表情识别的代表性工作. 作者&编辑 | Menpi ...
- 【人脸表情识别】不得不读的重要论文推荐(2015-2018篇)
前两篇专栏我们介绍了人脸表情识别的相关概念以及研究现状,并且了解了基于图片的人脸表情识别常用的数据集和预处理方法.接下来两篇专栏,笔者将从近5年基于图片的人脸表情识别的论文中推荐一些个人觉得具有代表性 ...
- android人脸情绪识别器,基于Android平台的人脸表情识别系统的设计与实现
摘要: 随着目前移动设备硬件技术的不断发展,其性能与PC的差距越来越小,这使得在嵌入式平台上进行图像处理成为了可能.目前使用最广泛的是基于Android系统的嵌入式平台,与之相关的图像类应用需求也渐渐 ...
- android 表情识别,基于Android平台的人脸表情识别系统的设计与实现
摘要: 随着目前移动设备硬件技术的不断发展,其性能与PC的差距越来越小,这使得在嵌入式平台上进行图像处理成为了可能.目前使用最广泛的是基于Android系统的嵌入式平台,与之相关的图像类应用需求也渐渐 ...
- 深度动态序列人脸表情识别——论文笔记
原文已上传Deep Facial Expression Recognition: A Survey (IEEE) 人脸表情识别分为动态序列识别和静态图片识别,本文只与动态序列有关 这里也有一篇推送解析 ...
最新文章
- Offer是否具有法律效力?
- oracle用户、表空间操作常用命令
- linux安装phoenix 5.1.0(对应hbase 2.2.6)
- 51单片机C语言led流水灯及数码管实现秒表
- 堆之二项堆(Binominal Heap)
- web 页面table 斜线效果 跨越多行和 多列
- face landmark 人脸特征点检测
- SAXReader解析xml
- 简单两个矩阵如何用计算机运算,教你使用excel做矩阵运算
- 如何减小电压跟随器输出电阻_一文看懂放大器和比较器差别
- 购买代购的产品算违法吗——看空姐代购被判刑有感
- (三)基于PHP——复杂的WSDL的创建(WSDL篇)
- 基于Spring Security和 JWT的权限系统设计
- Guass列选主元消去法和三角分解法
- 这几个方法让你实现EXCEL文件翻译成中文
- html(Web开发)
- TPM分析笔记(十)TPM 组织架构(TPM hierarchy)
- 12C DELETE FROM wri$_adv_sqlt_rtn_planWHERE task_id = :tid AND exec_name = :execution_name
- 手把手带你实现西瓜视频的责任链埋点框架
- 交互媒体专题设计——疫情模拟