android - 如何在使用 Android 移动视觉库时处理单个相机帧

标签 android camera face-detection android-vision

我正在尝试制作一个相机应用程序,它使用带有自定义相机实例的 Google 移动视觉 API 来检测人脸,而不是 Google API 中的“CameraSource”,因为我也在处理帧以检测颜色并使用 Camerasource我不允许得到相机框架。

搜索此问题后,我发现的唯一结果是关于将移动视觉与它的 CameraSource 一起使用,而不是与任何自定义 camera1 API 一起使用。 我试图覆盖帧处理,然后对输出的图片进行检测,如下所示:

camera.setPreviewCallback(new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                Log.d("onPreviewFrame", "" + data.length);
                Camera.Parameters parameters = camera.getParameters();
                int width = parameters.getPreviewSize().width;
                int height = parameters.getPreviewSize().height;
                ByteArrayOutputStream outstr = new ByteArrayOutputStream();
                Rect rect = new Rect(0, 0, width, height);
                YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null);
                yuvimage.compressToJpeg(rect, 20, outstr);
                Bitmap bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());
                detector = new FaceDetector.Builder(getApplicationContext())
                        .setTrackingEnabled(true)
                        .setClassificationType(FaceDetector.ALL_LANDMARKS)
                        .setMode(FaceDetector.FAST_MODE)
                        .build();

                detector.setProcessor(
                        new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory())
                                .build());

                if (detector.isOperational()) {
                    frame = new Frame.Builder().setBitmap(bmp).build();
                    mFaces = detector.detect(frame);
//                    detector.release();
                }
            }
        });

那么,有什么方法可以将移动视觉与我的相机实例联系起来,以便进行帧处理并用它检测人脸吗? 你可以在这里看到我到目前为止所做的: https://github.com/etman55/FaceDetectionSampleApp

**最新更新

找到 CameraSource 类的开源文件后,我解决了大部分问题,但现在当尝试检测人脸时,检测器可以正确接收帧,但它无法检测到任何东西 >> 您可以在github repo 。

最佳答案

我可以为您提供一些非常有用的提示。

  • 为相机提供的每一帧构建一个新的 FaceDetector 是非常的坏主意,而且也没有必要。您只需在相机框架接收器外启动一次。

  • 不必获取 YUV_420_SP(或 NV21)帧,然后将其转换为 YUV 实例,然后将其转换为位图,然后使用位图创建 Frame.Builder()。如果你看一下 Frame.Builder Documentation您可以看到它直接从 Camera Preview 允许 NV21。 像这样:

    @override public void onPreviewFrame(byte[] data, Camera camera) {detector.detect(new Frame.Builder().setImageData(ByteBuffer.wrap(data), previewW, previewH, ImageFormat.NV21)) ;}

关于android - 如何在使用 Android 移动视觉库时处理单个相机帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42225156/

相关文章:

java - 如何正确检查2 -3个条件?

c++ - 另一个透视相机问题

java - Android 和 OpenCV - 应用程序因 UI 更改而崩溃

android - 在由两个不同 Activity 调用的 DialogFragment 中,对于这种情况,您如何转换回调用 Activity ?

android 在相机上显示矩形

android - 如何从 SD 卡中检索文本并相应地设置 TextView ?

java - 如何使用 JNI 在 C 中获取原始 Android 相机缓冲区?

camera - 相机端 ONVIF 视频流是否存在开源代码? (不是客户端)

linux - OpenCv 人脸检测示例卡住,没有任何错误或日志

c# - 使用 Kinect 进行人脸检测