build.gradle
dependencies {
...
compile 'com.google.android.gms:play-services-vision:10.2.4'
...
}
AndroidManifest.xml
<application>
...
<meta-data
android:name="com.google.android.gms.vision.DEPENDENCIES"
android:value="face" />
...
</application>
FaceDetector
FaceDetector detector = new FaceDetector.Builder(context)
.setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
.setTrackingEnabled(true)
.setProminentFaceOnly(true)
.setLandmarkType(FaceDetector.NO_LANDMARKS)
.setMode(FaceDetector.FAST_MODE)
.build();
Face Tracker
public class FaceTracker extends Tracker<Face> {
public void onNewItem(int faceId, Face face) {
}
public void onUpdate(FaceDetector.Detections<Face> results, Face face) {
}
public void onMissing(FaceDetector.Detections<Face> results) {
}
public void onDone() {
}
}
Face Tracker Factory
private class FaceTrackerFactory implements MultiProcessor.Factory<Face> {
@Override
public Tracker<Face> create(Face face) {
return new FaceTracker();
}
}
//------------------------------
{
detector.setProcessor(
new MultiProcessor.Builder<>(new FaceTrackerFactory())
.build());
if (!detector.isOperational()) {
//TODO something
}
}
Camera Source
mCameraSource = new CameraSource.Builder(context, detector)
.setRequestedPreviewSize(640, 480)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedFps(30.0f)
.build();
HAAR Cascade Detector
Необходимо: Open CV (opencv_traincascade, opencv_createsamples)
opencv_createsamples -info face.txt -num 1000 -w 48 -h 24 -vec face.vec
opencv_traincascade -data data -vec face.vec -bg neg.txt -numPos 1000 -numNeg 1000 -numStages 20
-w 48 -h 24 -featureType HAAR -precalcValBufSize 512 -precalcIdxBufSize 512 -mode ALL
LBP Cascade Detector
Histogram of Oriented Gradients (HOG)
FaceDetector
FaceDetector detector = new FaceDetector.Builder(context)
.setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
.setTrackingEnabled(true)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.build();
{
//----------------------------------------------------
for (Landmark landmark : face.getLandmarks()) {
int cx = (int) (landmark.getPosition().x);
int cy = (int) (landmark.getPosition().y);
if (landmark.getType() == 4) {
canvas.drawBitmap(...);
}
//----------------------------------------------------
}