是否可以仅使用带有Google Vision API的Camera2检测脸部?我找不到整合它的方法。
答案 0 :(得分:6)
是的,可以将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 Image获取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;
}
然后您可以使用返回的byte []创建Google Vision Frame:
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。我希望我帮助过了:)。
答案 1 :(得分:1)
好的,我发现了这个camera2 with mobile vision? #65
在官方API中,CameraSource类的camera2版本没有近期计划。但是,考虑到API的结构,CameraSource的替代版本可以由使用camera2的开发人员社区编写。所有用于处理帧和检测器的现有API都足以支持camera2实现。