能否在Google Vision API中使用Camera2?

7

使用Camera2和Google Vision API是否可以仅检测人脸? 我找不到集成它的方法。

2个回答

8

是的,可以使用Camera2 API和Google Vision API。

首先,Google Vision API人脸检测器接收一个Frame对象来分析(检测面部和其特征点)。

Camera1 API以NV21图像格式提供预览帧,这对我们非常理想。Google Vision Frame.Builder支持setImageData(NV16、NV21或YV12图像格式的ByteBuffer)和setBitmap(使用位图作为要处理的预览帧)。

您的问题在于,Camera2 API以不同的格式提供预览帧。它是YUV_420_888。为了使一切正常工作,您必须将预览帧转换为其中一种受支持的格式。

当你从 ImageReader 获取 Camera2 预览帧作为 Image 后,你可以使用此函数将其转换为支持的格式(在本例中为 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;
}

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

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

最后,您使用创建的Frame调用检测器:
mDetector.receiveFrame(outputFrame);

无论如何,如果你想了解更多关于这个的内容,你可以在 GitHub 上免费测试我的工作示例:Camera2Vision。我希望我已经帮到你了 :)


Ezquiel,但是当我按照你的Github示例尝试应用条形码PDF417检测时,它并没有像预期那样工作。 PDF417条形码无法被很好地检测(QR码效果很好,但不是PDF417格式,我认为这是由于线程问题造成的...) - Jeffrey Liu
U平面去哪了?NV12是交错的UV格式,你的代码不能工作。 - Adrian Crețu
我正在生产中使用这段代码,运行完美。https://github.com/bytedeco/javacv/issues/298 https://bugs.chromium.org/p/libyuv/issues/detail?id=604 - Ezequiel Adrian

1

好的,我找到了这个使用移动视觉的相机? #65

官方API中的CameraSource类没有计划推出camera2版本。但是,考虑到API的结构,开发者社区可以编写一个使用camera2的CameraSource的替代版本。所有现有的用于处理帧和检测器的API也足以支持camera2实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接