前段日子,写了个人脸检测的小程序,可以检测标记图片、视频、摄像头中的人脸。效果还行吧,用的是opencv提供人脸库。至于具体的人脸检测原理,找资料去啃吧。
环境:VS2013+OPENCV2.4.10+Win8.1
一、基于对话框的MFC
首先,新建一个基于对话框的MFC应用程序,命名为myFaceDetect(取消“安全开发周期(SDL)检查”勾选,我自己习惯取消这个)。
放置Button,设置Button的ID和Caption。
图片按钮——ID:IDC_FACEDETECT
视频按钮——ID:IDC_FACEV
摄像头按钮——ID:IDC_FACEC
二、添加消息响应函数
为图片按钮、视频按钮、摄像头按钮,在类向导中添加消息响应函数。
在图片按钮上右键,选择类向导。在CMyFaceDetectDlg类(对话框类)下选中BN_CLICKED消息,点击添加处理程序。其余两个按钮,按同样操作,添加消息响应函数。
完成上述操作后,获得对应三个按钮的消息响应函数。
?
1
2
3
|
void CMyFaceDetectDlg::OnClickedFacedetect() //图片按钮
void CMyFaceDetectDlg::OnClickedFacev() //视频按钮
void CMyFaceDetectDlg::OnClickedFacec() //摄像头按钮
|
三、人脸检测实现
首先,将OpenCV2.4.10+VS2013环境的配置完成,这个网上有许多教程。这是我以前写的一篇配置教程:Visual Studio 2013+OpenCV2.4.10环境搭建教程
对话框类的头文件:MyFaceDetectDlg.h
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// MyFaceDetectDlg.h : 头文件
//
#pragma once
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2\\highgui\\highgui.hpp>
#include <opencv2\\ml\\ml.hpp>
#include <opencv.hpp>
#include "afxwin.h"
using namespace cv;
// CMyFaceDetectDlg 对话框
class CMyFaceDetectDlg : public CDialogEx
{
// 构造
public :
CMyFaceDetectDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_MYFACEDETECT_DIALOG };
protected :
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected :
HICON m_hIcon;
HICON m_catIcon; //程序的小猫图标。如果想用默认的图片,可以将其注释掉。
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public :
afx_msg void OnClickedFacedetect();
public :
CascadeClassifier cascade; //级联分类器
Mat image; //图片
double scale; //缩小比例。缩小图片可以加快检测速度,当然加快检测速度还有其他的方法。
public :
void detectAndDraw(Mat& img, CascadeClassifier& cascade, double scale); //添加的实现人脸检测的函数,核心函数
CButton m_btn; //为了美化按钮添加对象,可以注释掉。
afx_msg void OnClickedFacev();
afx_msg void OnClickedFacec();
afx_msg void OnBnClickedCancel();
};
|
对话框类的实现:MyFaceDetectDlg.cpp
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|