我正在尝试制作一个相机应用程序,它使用带有自定义相机实例的 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/