OpenCV图像处理——人脸表情识别
2017-07-31 20:53
471 查看
第一节 研究内容及背景
本设计要实现的内容是对人脸的表情(高兴、生气(愤怒)、悲伤)等进行识别,该功能的应用有人机交互应用、通信系统应用、娱乐游戏应用、智能医疗应用等等。计算机在我们的日常生活中运用广泛,当前人机交互的发展的方向是更加智能和友好,比如可以根据人脸的表情做出相对应的反应;通信领域的应用则主要是在传输过程中通过计算机对人脸的表情进行分类,提取出有用的信息,然后在接收端进行重新组合,节省宽带的占用和在网络环境较差时,能够进行传输;在娱乐游戏中的运用则主要是根据人脸的表情变化,做出相对应的反应,从而达到更好的娱乐效果;智能医疗的应用是在治疗的过程中,对严重患者的表情进行判断,从而达到了解病人的痛苦程度,进行相对应的治疗,以减轻患者的病痛情况。
第二节 实现方法
2.1 实现方法分析
人脸表情识别中需要运用人脸检测技术,识别人脸之后,再对表情图像做预处理(彩色图像灰度化、图像几何归一化和光照预处理),然后再对表情特征进行提取,分析,从而实现对表情的识别。国内外对于人脸的表情识别的研究近几年非常的多,涌现出了很多的算法,但对于表情的识别精度还是有待改进。
2.2 采用的方法/算法
本设计报告采用人脸检测技术,并进行标记,图像灰度化,图像几何归一化等方法,通过提取出嘴巴,眼睛两个地方的大小变化进行判断,识别精度较低,有待后续的改进与完善。
第3节 实现步骤
首先,对人脸、嘴巴和眼睛进行检测、识别和标记,对图像进行灰度化,归一化处理(如图3-1所示)
实现的效果:高兴(如图3-2所示);
生气、愤怒(如图3-3所示);
悲伤(如图3-4所示)
第四节 源代码
本项目源代码:
https://github.com/ahongl/ClassicalCode/blob/master/ExpressionRecognition.cpp
本设计要实现的内容是对人脸的表情(高兴、生气(愤怒)、悲伤)等进行识别,该功能的应用有人机交互应用、通信系统应用、娱乐游戏应用、智能医疗应用等等。计算机在我们的日常生活中运用广泛,当前人机交互的发展的方向是更加智能和友好,比如可以根据人脸的表情做出相对应的反应;通信领域的应用则主要是在传输过程中通过计算机对人脸的表情进行分类,提取出有用的信息,然后在接收端进行重新组合,节省宽带的占用和在网络环境较差时,能够进行传输;在娱乐游戏中的运用则主要是根据人脸的表情变化,做出相对应的反应,从而达到更好的娱乐效果;智能医疗的应用是在治疗的过程中,对严重患者的表情进行判断,从而达到了解病人的痛苦程度,进行相对应的治疗,以减轻患者的病痛情况。
第二节 实现方法
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 stream capture = cvCaptureFromCAM( 0);////-1 if( capture ) { cout<<"capture is ok."<<endl; while( true ) { frame = cvQueryFrame( capture ); //-- 3. Apply the classifier to the frame if( !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( 4000 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; else eyedx=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 got imshow( window_name, frame_gray ); }
本项目源代码:
https://github.com/ahongl/ClassicalCode/blob/master/ExpressionRecognition.cpp
相关文章推荐
- 图像处理--linux opencv2多线程人脸识别
- [转]基于OpenCV的PHP图像人脸识别技术
- 图像识别 python+opencv的简单人脸识别
- opencv实现人脸识别中过曝光人脸图片处理
- 【opencv学习】图像处理和图像识别中常用的OpenCV函数
- 图像识别与处理之Opencv——Mat_类与Mat 类的内存管理
- 图像识别与处理之Opencv——高斯滤波及GaussianBlur()函数
- opencv 人脸识别 (一)训练样本的处理
- 图像处理及图像识别中常用的 Opencv 函数
- 机器视觉开源处理库汇总-介绍n款计算机视觉库/人脸识别开源库/软件 -几种图像处理类库的比较-视觉相关网站
- 基于OpenCV的PHP图像人脸识别技术
- 图像识别与处理之Opencv——像素值的读写
- 图像识别与处理之Opencv——霍夫变换编程思路(11月2日暂存)
- opencv学习篇(1) 图像处理和图像识别中常用的OpenCV函数
- OpenCV+OCR 图像处理字符识别原理及代码
- opencv 人脸识别 (一)训练样本的处理
- OpenCV作图像处理和识别方面的编程时常用的基础语句积累!
- 基于OpenCV的PHP图像人脸识别技术
- Python-OpenCV 处理图像(六):对象识别