OpenCV人脸与眼睛检测及情绪分类全解析
立即解锁
发布时间: 2025-08-21 00:15:09 阅读量: 1 订阅数: 4 


英特尔Galileo开发实战指南
### OpenCV人脸与眼睛检测及情绪分类全解析
#### 1. OpenCV人脸与眼睛检测代码分析
在OpenCV的人脸与眼睛检测中,有一些关键的代码和类需要我们深入了解。
首先是`CascadeClassifier`类,它在检测过程中起着核心作用。我们需要创建两个`CascadeClassifier`对象,一个用于检测人脸,另一个用于检测眼睛:
```cpp
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
```
然后,使用`load`方法加载分类器文件:
```cpp
if( !face_cascade.load( face_cascade_name ) )
{
cout << face_cascade_name << " not found!! aborting..." << endl;
exit(-1);
};
if( !eyes_cascade.load( eye_cascade_name ) )
{
cout << eye_cascade_name << " not found!! aborting..." << endl;
exit(-1);
};
```
接下来是`detectMultiScale`方法,这是实现检测功能的关键:
```cpp
void cv::CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
```
该方法的参数解释如下:
- `image`:图像源。
- `vector<Rect>& objects`:存储检测到的对象的矩形向量。
- `scaleFactor`:决定图像是否缩小的因子。
- `minNeighbors`:每个候选矩形的邻居数量。设置为0可能会导致误检测,实际实验中,设置为2或3比较合适。
- `Flags`:与优化类型相关,如`CV_HAAR_SCALE_IMAGE`等。
- `minSize`:定义最小对象尺寸,小于该尺寸的对象将被忽略。
- `maxSize`:定义最大对象尺寸,大于该尺寸的对象将被忽略。
在代码中,我们使用以下方式进行人脸和眼睛的检测:
```cpp
// 检测人脸
face_cascade.detectMultiScale( img, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
// 在每个检测到的人脸中检测眼睛
std::vector<Rect> eyes;
Mat faceROI = frame_gray( faces[i] );
eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );
```
检测到人脸后,我们会在人脸周围绘制矩形:
```cpp
rectangle( img, faces[i], Scalar( 255, 100, 0 ), 4, 8, 0 );
```
对于检测到的眼睛,我们会在眼睛周围绘制圆形:
```cpp
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( img, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
}
```
整个检测过程的流程图如下:
```mermaid
graph TD
A[main] --> B[detectMultiScale() for faces]
B --> C{i = 0}
C --> D{Are there more faces in the current image?}
D -- YES --> E[Draw a rectangle on each face]
E --> F[Create a new image delimited by the rectangle area (ROI)]
F --> G[Convert the image to gray color space]
G --> H[detectMultiScale() for eyes]
H --> I{J = 0}
I --> J{Are there more eyes in the current face?}
J -- YES --> K[Draw a circle on each eye detected]
K --> L[j = j + 1]
L --> J
J -- NO --> M[i = i + 1]
M --> D
D -- NO --> N[END]
```
#### 2. 运行人脸与眼睛检测代码
要运行`opencv_face_and_eyes_detection.cpp`代码,需要按照以下步骤操作:
1. 编译代码并将文件传输到Intel Galileo。
2. 确保`uvcvideo`驱动已加载,并且将网络摄像头连接到USB端口。
3. 将`haarcascade_frontalface_alt.xml`和`haarcascade_eye.xml`文件复制到与可执行程序相同的位置。
4. 站在摄像头前,看向镜头,然后运行软件:
```bash
root@clanton:~# ./opencv_face_and_eyes_detection 2> /dev/null
```
运行成功后,会在文件系统中创建一个名为`face_and_eyes.jpg`的图像,其中包含检测到的所有人脸和眼睛。
#### 3. 情绪分类概述
情绪分类的方法和部分脚本基于Phillip Wagner的文章“Gender Classification with OpenCV”。原始代码经过修改,以在Intel Galileo上运行并对情绪进行分类,而不是对性别进行分类。情绪分类分为三个类别:快乐、悲伤和好奇。
#### 4. 准备桌面环境
要进行情绪分类,需要创建一个包含不同情绪状态图像的数据库。具
0
0
复制全文
相关推荐










