01
02
03
04
05
06
07
08
09
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
|
public
class
TutorialOnFaceDetect1
extends
Activity {
private
MyImageView mIV;
private
Bitmap mFaceBitmap;
private
int
mFaceWidth =
200
;
private
int
mFaceHeight =
200
;
private
static
final
int
MAX_FACES =
1
;
private
static
String TAG =
"TutorialOnFaceDetect"
;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
mIV =
new
MyImageView(
this
);
setContentView(mIV,
new
LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
// load the photo
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3);
mFaceBitmap = b.copy(Bitmap.Config.RGB_565,
true
);
b.recycle();
mFaceWidth = mFaceBitmap.getWidth();
mFaceHeight = mFaceBitmap.getHeight();
mIV.setImageBitmap(mFaceBitmap);
// perform face detection and set the feature points setFace();
mIV.invalidate();
}
public
void
setFace() {
FaceDetector fd;
FaceDetector.Face [] faces =
new
FaceDetector.Face[MAX_FACES];
PointF midpoint =
new
PointF();
int
[] fpx =
null
;
int
[] fpy =
null
;
int
count =
0
;
try
{
fd =
new
FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);
count = fd.findFaces(mFaceBitmap, faces);
}
catch
(Exception e) {
Log.e(TAG,
"setFace(): "
+ e.toString());
return
;
}
// check if we detect any faces
if
(count >
0
) {
fpx =
new
int
[count];
fpy =
new
int
[count];
for
(
int
i =
0
; i < count; i++) {
try
{
faces<i>.getMidPoint(midpoint);
fpx = (
int
)midpoint.x;
fpy = (
int
)midpoint.y;
}
catch
(Exception e) {
Log.e(TAG,
"setFace(): face "
+ i +
": "
+ e.toString());
}
}
}
mIV.setDisplayPoints(fpx, fpy, count,
0
);
}
} </i>
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
// set up detected face features for display
public
void
setDisplayPoints(
int
[] xx,
int
[] yy,
int
total,
int
style) {
mDisplayStyle = style;
mPX =
null
;
mPY =
null
;
if
(xx !=
null
&& yy !=
null
&& total >
0
) {
mPX =
new
int
[total];
mPY =
new
int
[total];
for
(
int
i =
0
; i < total; i++) {
mPX = xx;
mPY = yy;
}
}
}
|
01
02
03
04
05
06
07
08
09
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
|
public
class
TutorialOnFaceDetect
extends
Activity {
private
MyImageView mIV;
private
Bitmap mFaceBitmap;
private
int
mFaceWidth =
200
;
private
int
mFaceHeight =
200
;
private
static
final
int
MAX_FACES =
10
;
private
static
String TAG =
"TutorialOnFaceDetect"
;
private
static
boolean
DEBUG =
false
;
protected
static
final
int
GUIUPDATE_SETFACE =
999
;
protected
Handler mHandler =
new
Handler(){
// @Override
public
void
handleMessage(Message msg) {
mIV.invalidate();
super
.handleMessage(msg);
}
};
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
mIV =
new
MyImageView(
this
);
setContentView(mIV,
new
LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
// load the photo
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3);
mFaceBitmap = b.copy(Bitmap.Config.RGB_565,
true
);
b.recycle();
mFaceWidth = mFaceBitmap.getWidth();
mFaceHeight = mFaceBitmap.getHeight();
mIV.setImageBitmap(mFaceBitmap);
mIV.invalidate();
// perform face detection in setFace() in a background thread
doLengthyCalc();
}
public
void
setFace() {
FaceDetector fd;
FaceDetector.Face [] faces =
new
FaceDetector.Face[MAX_FACES];
PointF eyescenter =
new
PointF();
float
eyesdist =
0
.0f;
int
[] fpx =
null
;
int
[] fpy =
null
;
int
count =
0
;
try
{
fd =
new
FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);
count = fd.findFaces(mFaceBitmap, faces);
}
catch
(Exception e) {
Log.e(TAG,
"setFace(): "
+ e.toString());
return
;
}
// check if we detect any faces
if
(count >
0
) {
fpx =
new
int
[count *
2
];
fpy =
new
int
[count *
2
];
for
(
int
i =
0
; i < count; i++) {
try
{
faces<i>.getMidPoint(eyescenter);
eyesdist = faces<i>.eyesDistance();
// set up left eye location
fpx[
2
* i] = (
int
)(eyescenter.x - eyesdist /
2
);
fpy[
2
* i] = (
int
)eyescenter.y;
// set up right eye location
fpx[
2
* i +
1
] = (
int
)(eyescenter.x + eyesdist /
2
);
fpy[
2
* i +
1
] = (
int
)eyescenter.y;
if
(DEBUG) {
Log.e(TAG,
"setFace(): face "
+ i +
": confidence = "
+ faces<i>.confidence()
+
", eyes distance = "
+ faces<i>.eyesDistance()
+
", pose = ("
+ faces<i>.pose(FaceDetector.Face.EULER_X) +
","
+ faces<i>.pose(FaceDetector.Face.EULER_Y) +
","
+ faces<i>.pose(FaceDetector.Face.EULER_Z) +
")"
+
", eyes midpoint = ("
+ eyescenter.x +
","
+ eyescenter.y +
")"
);
}
}
catch
(Exception e) {
Log.e(TAG,
"setFace(): face "
+ i +
": "
+ e.toString());
}
}
}
mIV.setDisplayPoints(fpx, fpy, count *
2
,
1
);
}
private
void
doLengthyCalc() {
Thread t =
new
Thread() {
Message m =
new
Message();
public
void
run() {
try
{
setFace();
m.what = TutorialOnFaceDetect.GUIUPDATE_SETFACE;
TutorialOnFaceDetect.
this
.mHandler.sendMessage(m);
}
catch
(Exception e) {
Log.e(TAG,
"doLengthyCalc(): "
+ e.toString());
}
}
};
t.start();
}
}
</i></i></i></i></i></i></i>
|