peertube-live-streaming/encoder/src/main/java/com/pedro/encoder/input/video/FaceDetectorUtil.java

83 lines
2.3 KiB
Java

package com.pedro.encoder.input.video;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.RectF;
import android.hardware.Camera;
import android.hardware.camera2.params.Face;
import android.os.Build;
import androidx.annotation.RequiresApi;
import android.view.View;
/**
* Created by pedro on 17/10/18.
*/
public class FaceDetectorUtil {
public class FaceParsed {
private PointF position;
private PointF scale;
public FaceParsed(PointF position, PointF scale) {
this.position = position;
this.scale = scale;
}
public PointF getPosition() {
return position;
}
public void setPosition(PointF position) {
this.position = position;
}
public PointF getScale() {
return scale;
}
public void setScale(PointF scale) {
this.scale = scale;
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public FaceParsed camera2Parse(Face face, View view, PointF scale, int rotation,
boolean isFrontCamera) {
//Parse face
RectF rect = new RectF(face.getBounds());
Matrix matrix = new Matrix();
matrix.setScale(isFrontCamera ? -1 : 1, 1);
matrix.postRotate(rotation);
matrix.postScale(1f, 1f);
matrix.postTranslate(view.getWidth(), view.getHeight());
matrix.mapRect(rect);
return getFace(rect, scale, view);
}
public FaceParsed camera1Parse(Camera.Face face, View view, PointF scale, int rotation,
boolean isFrontCamera) {
//Parse face
RectF rect = new RectF(face.rect);
Matrix matrix = new Matrix();
matrix.setScale(isFrontCamera ? -1 : 1, 1);
matrix.postRotate(rotation);
matrix.postScale(view.getWidth() / 2000f, view.getHeight() / 2000f);
matrix.postTranslate(view.getWidth() / 2f, view.getHeight() / 2f);
matrix.mapRect(rect);
return getFace(rect, scale, view);
}
private FaceParsed getFace(RectF rectF, PointF scale, View view) {
//Position
float posX = rectF.centerX() * 100 / view.getWidth();
float posY = rectF.centerY() * 100 / view.getHeight();
PointF positionParsed = new PointF(posX - scale.x / 2, posY - scale.y / 2);
//Scale
float scaleX = rectF.width() * 100 / view.getWidth();
float scaleY = rectF.height() * 100 / view.getHeight();
PointF scaleParsed = new PointF(scaleX, scaleY);
return new FaceParsed(positionParsed, scaleParsed);
}
}