是否可以将Camera2与Google Vision API一起使用

ash*_*007 7 android android-camera2

是否可以仅使用带有Google Vision API的Camera2检测脸部?我找不到整合它的方法.

Eze*_*ian 7

是的,可以将Camera2 API与Google Vision API一起使用.

首先,Google Vision API面部检测器接收用于分析(检测面部及其地标)的Frame对象.

Camera1 API以NV21图像格式提供预览帧,非常适合我们.Google Vision Frame.Builder支持setImageData(NV16中的ByteBuffer,NV21或YV12图像格式)和setBitmap,以使用位图作为预览帧进行处理.

您的问题是Camera2 API以不同的格式提供预览帧.这是YUV_420_888.要使一切正常,您必须将预览帧转换为支持的格式之一.

ImageReader获取Camera2预览帧作为图像后,您可以使用此功能将其转换为支持的格式(在本例中为NV21).

private byte[] convertYUV420888ToNV21(Image imgYUV420) {
    // Converting YUV_420_888 data to YUV_420_SP (NV21).
    byte[] data;
    ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer();
    ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer();
    int buffer0_size = buffer0.remaining();
    int buffer2_size = buffer2.remaining();
    data = new byte[buffer0_size + buffer2_size];
    buffer0.get(data, 0, buffer0_size);
    buffer2.get(data, buffer0_size, buffer2_size);
    return data;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用返回的byte []创建Google Vision框架:

outputFrame = new Frame.Builder()
    .setImageData(nv21bytes, mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.NV21)
    .setId(mPendingFrameId)
    .setTimestampMillis(mPendingTimeMillis)
    .setRotation(mSensorOrientation)
    .build();
Run Code Online (Sandbox Code Playgroud)

最后,使用创建的Frame调用检测器:

mDetector.receiveFrame(outputFrame);
Run Code Online (Sandbox Code Playgroud)

无论如何,如果您想了解更多相关信息,可以在GitHub上免费测试我的工作示例:Camera2Vision.我希望我帮助过:)


ash*_*007 1

好的,我找到了这款 具有移动视觉功能的相机2?第65章

官方 API 中没有针对 Camera2 版本的 CameraSource 类的近期计划。然而,考虑到 API 的结构,使用camera2 的开发者社区可以编写CameraSource 的替代版本。所有用于处理帧和检测器的现有 API 也足以支持camera2 实现。