Vous devez créer votre propre version de suivi de visage qui prolongera google.vision détecteur de visage. Dans votre MainActivity ou FaceTrackerActivity (dans l'échantillon de suivi Google), élaborez votre version de classe FaceDetector comme suit:
class MyFaceDetector extends Detector<Face> {
private Detector<Face> mDelegate;
MyFaceDetector(Detector<Face> delegate) {
mDelegate = delegate;
}
public SparseArray<Face> detect(Frame frame) {
YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, frame.getMetadata().getWidth(), frame.getMetadata().getHeight(), null);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, frame.getMetadata().getWidth(), frame.getMetadata().getHeight()), 100, byteArrayOutputStream);
byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap TempBitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);
//TempBitmap is a Bitmap version of a frame which is currently captured by your CameraSource in real-time
//So you can process this TempBitmap in your own purposes adding extra code here
return mDelegate.detect(frame);
}
public boolean isOperational() {
return mDelegate.isOperational();
}
public boolean setFocus(int id) {
return mDelegate.setFocus(id);
}
}
Ensuite, vous devez joindre à votre propre FaceDetector avec CameraSource en modifiant votre méthode de CreateCameraSource comme suit:
private void createCameraSource() {
Context context = getApplicationContext();
// You can use your own settings for your detector
FaceDetector detector = new FaceDetector.Builder(context)
.setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
.setProminentFaceOnly(true)
.build();
// This is how you merge myFaceDetector and google.vision detector
MyFaceDetector myFaceDetector = new MyFaceDetector(detector);
// You can use your own processor
myFaceDetector.setProcessor(
new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory())
.build());
if (!myFaceDetector.isOperational()) {
Log.w(TAG, "Face detector dependencies are not yet available.");
}
// You can use your own settings for CameraSource
mCameraSource = new CameraSource.Builder(context, myFaceDetector)
.setRequestedPreviewSize(640, 480)
.setFacing(CameraSource.CAMERA_FACING_FRONT)
.setRequestedFps(30.0f)
.build();
}
Qu'est-ce que vous cherchez semble être disponible à 'FaceDetector.SparseArray détecter (Frame var1)'. Une fois que vous avez une attente sur un objet Frame, vous avez getBitmap() qui semble très prometteur. Malheureusement, cette classe est finale, ce qui signifie que l'interception de Frame devrait être possible en utilisant la réflexion. –
Fabio
Je ne suis pas sûr d'avoir ce que vous suggérez. Ai-je raison, que vous supposez que j'ai un objet Frame à portée de main? Parce que c'est le problème auquel je suis confronté. J'ai un objet de visage détecté sans le cadre actuel et j'ai besoin du cadre correspondant à un objet de visage donné. Par exemple, le lien fourni dans ma question a une méthode onUpdate() en bas. Étant donné cette méthode, comment puis-je obtenir le cadre actuel correspondant à l'argument Face de la méthode? –
Nous n'avons pas accès à un cadre, sauf si vous enveloppez toutes les méthodes dans FaceDetector et interceptez la méthode de détection (la réflexion n'aidera apparemment pas car elle est définitive). Sauvegardez le cadre et créez un getter, puis appelez le dans d'autres endroits au bon moment. – Fabio