如何使用Preview处理旋转问题;人脸检测

时间:2013-09-18 14:40:07

标签: android canvas camera rotation preview

我有一些问题唠叨了我一段时间了。

我的自定义相机应用程序显示了实时预览。我还在使用FaceDetection来更好地关注人脸。当我检查我在Gallery中拍摄的图片时,我可以正确地看到矩形。下一步是在实时预览中显示FaceDetection-Rectangle。所以我决定使用一个画布来获取Preview-Rectangle的坐标,并将它们转换为画布可以使用的坐标。

我的问题是我必须将预览旋转90度才能正确显示预览。因此,当我在绘制之前旋转画布视图时,矩形也会正确显示并移动右轴。但是矩形可以从左侧和右侧移出屏幕,并且仅使用大约一半的可用高度。我认为轮换引起了麻烦,但我无法把事情弄清楚。有人有个主意吗?

屏幕截图(我添加了紫色线条,以显示红色矩形无法到达的顶部/底部部分): enter image description here

预览

        mCamera = Camera.open();
        mCamera.getParameters();
        mCamera.setDisplayOrientation(90);          
        mCamera.setFaceDetectionListener(new FaceDetectionListener() {

            @Override
            public void onFaceDetection(Face[] faces, Camera camera) {

                        if(mDraw != null) {
                            mDraw.update(f.rect, f);
                        }
                    }
                }
            }
        });
        mCamera.startFaceDetection();
}

private DrawOnTop  mDraw = null;
public void setDrawOnTop(DrawOnTop d) {
    this.mDraw = d;
}

DrawOnTop:

public DrawOnTop(Context context) {
    super(context);
    myColor = new Paint();

    myColor.setStyle(Paint.Style.STROKE);
    myColor.setColor(Color.RED);
}

@Override
protected void onDraw(Canvas canvas) {
        rect.set((((rect.left+1000)*1000) / WIDTH_DIVISOR),(((rect.top+1000)*1000) / HEIGHT_DIVISOR),(((rect.right+1000)*1000) / WIDTH_DIVISOR),(((rect.bottom+1000)*1000) / HEIGHT_DIVISOR ));         
        setRotation(90);
        canvas.drawRect(rect, myColor);
}

public void update(Rect rect, Face face) {
    this.invalidate();
    this.rect = rect;
    this.face = face;
}

----------------------------------------------- -----------------------------------------


修改 我得出结论,这是一个罕见但已知的错误,到目前为止还没有其他解决办法,但迫使应用程序进入横向模式。工作正常,但尺寸看起来有点拉伸或铆接,具体取决于用户操作的视角。

1 个答案:

答案 0 :(得分:2)

编辑:我误解了这个问题并谈到了错误的矩形。这就是我的意思:

基本上,你只需要缩放紫色矩形。找到定义它的位置,然后将其放在画布上并执行以下操作:

float screenWidth = /*get the width of your screen here*/;
float xScale = rect.width / screenWidth;

float screenHeight = /*get the height of your screen here*/;
float yScale = rect.height / screenWidth;

canvas.setScaleX(xScale);
canvas.setScaleY(yScale);

这样,坐标将被正确翻译。

第二次编辑(回复您的评论):如果您愿意,也可以使用视图执行此操作。 玩得开心。