用于人脸检测和距离测量的AndroidCamera2

用于人脸检测和距离测量的AndroidCamera2,android,android-camera2,Android,Android Camera2,我正在制作一个摄像头,需要检测用户的面部/眼睛,并测量通过眼睛的距离。 我发现在这个项目中,它工作得很好,但是它没有使用前置摄像头的预览(实际上,我在至少10个人身上进行了测试,所有测量都非常接近或完美)。 我的应用程序已经有了一个由我制作的自拍相机部件,但使用旧的相机API,我没有找到一个解决方案,让相机预览和面部距离一起工作,总是会收到一个错误,即相机已经在使用 我决定使用camera2来使用多个摄影机流,我仍然在学习为不同的事物同时使用两个流的过程。顺便说一句,关于这方面的文档似乎太少了,

我正在制作一个摄像头,需要检测用户的面部/眼睛,并测量通过眼睛的距离。 我发现在这个项目中,它工作得很好,但是它没有使用前置摄像头的预览(实际上,我在至少10个人身上进行了测试,所有测量都非常接近或完美)。 我的应用程序已经有了一个由我制作的自拍相机部件,但使用旧的相机API,我没有找到一个解决方案,让相机预览和面部距离一起工作,总是会收到一个错误,即相机已经在使用

我决定使用camera2来使用多个摄影机流,我仍然在学习为不同的事物同时使用两个流的过程。顺便说一句,关于这方面的文档似乎太少了,我真的很迷茫

现在,我是否走上了正确的道路? 此外,在他的项目中,Ivan使用了:

        Camera camera = frontCam();
        Camera.Parameters campar = camera.getParameters();
        F = campar.getFocalLength();
        angleX = campar.getHorizontalViewAngle();
        angleY = campar.getVerticalViewAngle();
        sensorX = (float) (Math.tan(Math.toRadians(angleX / 2)) * 2 * F);
        sensorY = (float) (Math.tan(Math.toRadians(angleY / 2)) * 2 * F);
这是旧的摄像头API,我如何在新的API上调用它? 从这个答案来看,

我需要获取最小和最大焦距吗?

对于水平角和垂直角,我发现了这个:

我相信剩下的部分是通过谷歌的云视觉API完成的

编辑:

我让它在camera2上工作,使用GMS自己的示例CameraSourcePreview和GraphicOverlay来显示我想要一起显示的任何内容预览和检测人脸

现在要获取相机特性:

CameraManager manager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
            try {
                character = manager.getCameraCharacteristics(String.valueOf(1));
            } catch (CameraAccessException e) {
                Log.e(TAG, "CamAcc1Error.", e);
            }

            angleX = character.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE).getWidth();
            angleY = character.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE).getHeight();
            sensorX = (float)(Math.tan(Math.toRadians(angleX / 2)) * 2 * F);
            sensorY = (float)(Math.tan(Math.toRadians(angleY / 2)) * 2 * F);
这几乎给了我毫米的精确距离,这正是我所需要的。 现在剩下的是通过GMS的CameraSourcePreview从这个预览中获得一张图片,以便我以后使用

此处进行最终编辑:

我解决了图片问题,但忘了在这里编辑。问题是,所有使用camera2拍摄照片的示例都非常复杂(正确地说,这是一个比camera更好的API,有很多选项),但可以简化为我在这里所做的:

mCameraSource.takePicture(null, bytes -> {
                Bitmap bitmap;
                bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                if (bitmap != null) {
                    Matrix matrix = new Matrix();
                    matrix.postRotate(180);
                    matrix.postScale(1, -1);
                    rotateBmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                            bitmap.getHeight(), matrix, false);
                    saveBmp2SD(STORAGE_PATH, rotateBmp);
                    rotateBmp.recycle();
                    bitmap.recycle();
                }
            });

这就是我拍摄照片并保存到指定位置所需的全部内容,不介意在这里循环使用,这不对,我正在处理它

看起来数学部分正在通过以下等式计算图像传感器的物理尺寸:

camera2 API将传感器尺寸直接作为相机特性的一部分:

事实上,如果你想在camera2中获得视野,你必须在另一个方向使用相同的方程,因为FOV不是相机特性的一部分


除此之外,您链接的示例似乎只是使用旧的摄影机API获取FOV信息,然后关闭摄影机并使用Vision API实际驱动摄影机。因此,您必须查看vision API文档,以了解如何为其提供摄像头输入,而不是让其驱动一切。或者你也可以使用摄像头API的内置功能,在许多设备上都可以使用。

谢谢你的回答,我现在就来研究一下,我还从别处读到,Vision API和camera2必须有一些变通方法才能协同工作。关于内置的人脸检测器,这似乎是一种更容易实现我想要的方法,而且似乎没有太多没有眼睛定位的设备。