android - 我如何处理预览和人脸检测的旋转问题

标签 android canvas camera rotation preview

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

我得到了可以显示实时预览的自定义相机应用程序。此外,我还使用 FaceDetection 来更好地关注人们的脸部。当我检查图库中拍摄的照片时,我可以正确地看到矩形。下一步是使 FaceDetection-矩形在实时预览中可见。因此,我决定使用 Canvas 从预览矩形获取坐标,并将它们转换为 Canvas 可以使用的坐标。

我的问题是我必须将预览旋转 90 度才能正确显示预览。因此,当我在绘制 Canvas 之前旋转 Canvas 的 View 时,矩形会正确显示并移动右轴。但矩形可以从左侧和右侧移出屏幕,并且仅使用大约一半的可用高度。我认为旋转造成了麻烦,但我无法设法解决问题。有人有主意吗?

屏幕截图(我添加了紫色线来显示红色矩形无法到达的顶部/底部部分): 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;
}

在顶部绘制:

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

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


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

最佳答案

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

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

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

这样,坐标就会被正确转换。

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

关于android - 我如何处理预览和人脸检测的旋转问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875260/

相关文章:

javascript - HTML Canvas 不会在 IE 中调整大小

python - 使用 OpenCV 和 Python 多处理进行持续相机抓取

opencv - 如何用OpenCV检测红外线

android - Android 中的相机预览质量很差

android - 在 back4app 中重复推送通知

android - 多线程应用程序中的同步阻塞

Android Market 发布问题

android - 最简单的安全 Android 服务器后端

javascript - 为什么这个函数不能检测重叠的圆?

html - 如何将图像放在 Canvas 上其他绘图的后面?