【问题标题】:How can i handle the rotation issue with Preview & FaceDetection如何使用 Preview 和 FaceDetection 处理旋转问题
【发布时间】:2013-09-23 09:23:54
【问题描述】:

我有一些问题困扰了我很长一段时间。

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

我的问题是我必须将预览旋转 90 度才能正确显示预览。因此,当我在绘制之前旋转画布的视图时,矩形会正确显示并移动右轴。但是矩形可以左右移出屏幕,并且只使用大约一半的可用高度。我认为旋转会导致麻烦,但我无法把事情做好。有人有想法吗?

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

预览:

        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;
}

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


编辑: 我得出的结论是,这是一个罕见但已知的错误,到目前为止,除了强制应用程序进入横向模式之外,没有其他解决方案。工作正常,但根据用户操作的视角,尺寸看起来有点拉长或紧缩。

【问题讨论】:

    标签: android canvas camera rotation preview


    【解决方案1】:

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

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

    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);
    

    这样,坐标将被正确转换。

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

    【讨论】:

    • 它不再显示矩形。我的同事认为在这种情况下我将不得不使用翻译!?
    • @bofredo - 我看不到 translate 在这里能为你做什么。但我看到我可能误读了你的问题。 rect红色矩形还是紫色矩形?如果是红色的,紫色矩形在哪里指定?
    • rect 是红色的。我用 gPaint 画了紫色线条只是为了显示红色矩形不能超过的范围。
    • @bofredo - 真可惜。您需要在算法中找到紫色矩形,然后按照我的建议对其进行缩放。生病编辑我的答案。
    • 找到了这个简短的待办事项:“所以我们必须在 onDraw 中将 (-1000, -1000)~(1000, 1000) 转换为 (0, 0)~(视图的宽度, 高度) () 的绘图视图。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多