我正在用一个简单的应用程序实现MLKit人脸检测库。该应用程序是一个面部监控系统,因此我正在设置前置摄像头的预览供稿,并尝试检测面部。我正在使用camera2Api。在我的ImageReader.onImageAvailableListener上,我想对图像中的每次读取实施firebase人脸检测。创建我的FirebaseVisionImage并运行FirebaseVisionFaceDetector后,我得到一个空的面孔列表,其中应该包含检测到的面孔,但是即使图像中有面孔,我也总是得到大小为0的面孔。
我尝试了其他方式来创建FirebaseVisionImage。目前,我正在通过使用我在MlKit文档之后创建的byteArray来创建它。我还尝试过使用媒体Image对象创建FirebaseVisionImage。
private final ImageReader.OnImageAvailableListener onPreviewImageAvailableListener = new ImageReader.OnImageAvailableListener() {
/**Get Image convert to Byte Array **/
@Override
public void onImageAvailable(ImageReader reader) {
//Get latest image
Image mImage = reader.acquireNextImage();
if(mImage == null){
return;
}
else {
byte[] newImg = convertYUV420888ToNV21(mImage);
FirebaseApp.initializeApp(MonitoringFeedActivity.this);
FirebaseVisionFaceDetectorOptions highAccuracyOpts =
new FirebaseVisionFaceDetectorOptions.Builder()
.setPerformanceMode(FirebaseVisionFaceDetectorOptions.ACCURATE)
.setLandmarkMode(FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS)
.setClassificationMode(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
.build();
int rotation = getRotationCompensation(frontCameraId,MonitoringFeedActivity.this, getApplicationContext() );
FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
.setWidth(480) // 480x360 is typically sufficient for
.setHeight(360) // image recognition
.setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
.setRotation(rotation)
.build();
FirebaseVisionImage image = FirebaseVisionImage.fromByteArray(newImg, metadata);
FirebaseVisionFaceDetector detector = FirebaseVision.getInstance()
.getVisionFaceDetector(highAccuracyOpts);
Task<List<FirebaseVisionFace>> result =
detector.detectInImage(image)
.addOnSuccessListener(
new OnSuccessListener<List<FirebaseVisionFace>>() {
@Override
public void onSuccess(List<FirebaseVisionFace> faces) {
// Task completed successfully
if (faces.size() != 0) {
Log.i(TAG, String.valueOf(faces.get(0).getSmilingProbability()));
}
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
mImage.close();
目的是使生成的面部列表包含每个已处理图像中检测到的面部。
答案 0 :(得分:0)
byte [] newImg = convertYUV420888ToNV21(mImage); FirebaseVisionImage图片= FirebaseVisionImage.fromByteArray(newImg,元数据);
这两行很重要。确保其创建正确的VisionImage。
检出我的项目的所有功能