使用Camera2和Google Vision API是否可以仅检测人脸? 我找不到集成它的方法。
使用Camera2和Google Vision API是否可以仅检测人脸? 我找不到集成它的方法。
是的,可以使用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();
mDetector.receiveFrame(outputFrame);
无论如何,如果你想了解更多关于这个的内容,你可以在 GitHub 上免费测试我的工作示例:Camera2Vision。我希望我已经帮到你了 :)
好的,我找到了这个使用移动视觉的相机? #65
官方API中的CameraSource类没有计划推出camera2版本。但是,考虑到API的结构,开发者社区可以编写一个使用camera2的CameraSource的替代版本。所有现有的用于处理帧和检测器的API也足以支持camera2实现。