我正在尝试使用Firebase和View在检测到的脸部周围绘制一个矩形,但是我不确定相机的方向和脸部旋转轴如何影响Firebase检测脸部的方式。我现在遇到的问题是,当使用前置摄像头时,当我向右转动头时,盒子将向左移动。当我将手机稍微向右平移时,即使我的头在相机屏幕上向左移动,该框也会向右移动。使用后置摄像头时,盒子相对于面部的移动方向也不同。但是,当我抬起头时,绘制的矩形能够正确跟随。
我如何考虑手机的方向,使用的摄像头以及头部和手机的旋转角度?
到目前为止,我有几种方法。
public void draw(Canvas canvas) {
RectF rectF = new RectF(rect);
rectF.left = translateX(rectF.left);
rectF.right = translateX(rectF.right);
rectF.top = translateY(rectF.top);
rectF.bottom = translateY(rectF.bottom);
canvas.drawRect(rectF,rectPaint);
}
我有处理面部数据的方法
public static void process(List<FirebaseVisionFace> faces, GraphicOverlay graphicOverlay) {
int count = 0;
for (FirebaseVisionFace face : faces) {
Rect bounds = face.getBoundingBox();
//draw rectangle
RectOverlay rect = new RectOverlay(graphicOverlay, bounds);
graphicOverlay.add(rect);
FirebaseVisionFaceLandmark leftEyeLandmark = face.getLandmark(FirebaseVisionFaceLandmark.LEFT_EYE);
FirebaseVisionPoint leftEyePoint = leftEyeLandmark.getPosition();
Rect leftEyeRect = new Rect(Math.round(leftEyePoint.getX() - 10), Math.round(leftEyePoint.getY() + 10)
, Math.round(leftEyePoint.getX() + 10), Math.round(leftEyePoint.getY() - 10));
graphicOverlay.add(new RectOverlay(graphicOverlay, leftEyeRect));
count++;
}
}
我还有一个GraphicOverlay
类,它在RectOverlay
类中传递,因此可以绘制。