Can';t使用Fatter和Firebase\u ml\u vision使人脸检测正常工作
我已经为此奋斗了大约24小时,关于如何解决这个问题,我的想法到此为止 我已经编写了代码,从Firebase加载一个图像,并检测其中的一张脸——一点问题也没有。但是,当我使用Flatter中的标准imagePicker类拍摄照片时,尽管我实际在屏幕上显示图像以检查其是否为有效文件,faceDetector却无法在图像中找到任何人脸 下面是该代码的编辑版本。不会编译,因为我的项目中缺少了一些东西,但希望你能理解。测试平台是iOS(设备,而不是模拟器)。插件是firebase_ml_vision 0.9.6+2,颤振的版本是几天前的最新版本 有人有什么想法吗Can';t使用Fatter和Firebase\u ml\u vision使人脸检测正常工作,firebase,flutter,vision,mlvision,firebase-machine-learning,Firebase,Flutter,Vision,Mlvision,Firebase Machine Learning,我已经为此奋斗了大约24小时,关于如何解决这个问题,我的想法到此为止 我已经编写了代码,从Firebase加载一个图像,并检测其中的一张脸——一点问题也没有。但是,当我使用Flatter中的标准imagePicker类拍摄照片时,尽管我实际在屏幕上显示图像以检查其是否为有效文件,faceDetector却无法在图像中找到任何人脸 下面是该代码的编辑版本。不会编译,因为我的项目中缺少了一些东西,但希望你能理解。测试平台是iOS(设备,而不是模拟器)。插件是firebase_ml_vision 0.
import 'package:flutter/material.dart';
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:image_picker/image_picker.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import 'dart:io';
import 'dart:async';
import 'package:camera/camera.dart';
class imageComparison extends StatefulWidget {
@override
_imageComparison createState() => _imageComparison();
}
class _imageComparison extends State<imageComparison> {
CameraController controller;
List<CameraDescription> cameras;
File chosenImage;
bool gotImage = false;
File grabbedImage;
FaceDetector faceDetector;
File tempImg;
@override
void initState() {
super.initState();
faceDetector = FirebaseVision.instance.faceDetector(FaceDetectorOptions(enableLandmarks: true, enableContours: true, enableClassification: true));
availableCameras().then((value) {
cameras = value;
controller = CameraController(cameras[1], ResolutionPreset.medium);
controller.initialize().then((_) {
if (!mounted) {
return;
}
setState(() {});
});
});
}
@override
Widget build(BuildContext context) {
if (controller == null) {
return Scaffold(
backgroundColor: Colors.white,
body: Container(),
);
}
if (!gotImage) {
File img;
downloadImage(imageURLs[0], 'verificationImage.jpg').then((value) {
img = tempImg = value;
extractFace(img).then((value2) {
print('got image');
gotImage = true;
setState(() {});
});
});
}
return Scaffold(
backgroundColor: Colors.white,
body: ModalProgressHUD(
inAsyncCall: globals.showSpinner,
child: Container(
width: globals.SizeConfig.blockSizeHorizontal * 100,
height: globals.SizeConfig.blockSizeVertical * 100,
decoration: BoxDecoration(
gradient: gradient,
),
child: Stack(
children: <Widget>[
Positioned(
left: globals.SizeConfig.blockSizeHorizontal * 10,
top: globals.SizeConfig.blockSizeVertical * 5,
child: Column(
children: [
FlatButton(
child: Text(
'check',
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white, fontSize: globals.SizeConfig.blockSizeHorizontal * 4),
),
color: Colors.red,
onPressed: () async {
bool res = await takeAndAnalyseImage();
//other stuff
},
),
],
),
),
],
),
),
),
);
}
Future<bool> takeAndAnalyseImage() async {
//String filepath = await takePicture();
grabbedImage = File((await ImagePicker().getImage(source: ImageSource.camera)).path);
//grabbedImage = File(filepath);
setState(() {
print('setting state');
});
while (grabbedImage == null) {}
if (mounted) {
extractFace(grabbedImage).then((value) {
//irrelevant stuff
});
}
return null;
}
Future<Map<String, dynamic>> extractFace(File img) async {
FirebaseVisionImage visionImage;
visionImage = FirebaseVisionImage.fromFile(img);
Map<String, dynamic> facevals = Map<String, dynamic>();
List<Face> faces;
try {
faces = await faceDetector.processImage(visionImage);
} catch (e) {
print('can\'t extract face from image. e = ' + e.toString());
}
for (Face face in faces) {
//do irrelevant stuff to question.
}
return facevals;
}
}
进口“包装:颤振/材料.省道”;
导入“包:firebase_ml_vision/firebase_ml_vision.dart”;
导入“包:image_picker/image_picker.dart”;
导入“程序包:modal_progress_hud/modal_progress_hud.dart”;
导入“dart:io”;
导入“dart:async”;
导入“包:摄像机/摄像机.dart”;
类imageComparison扩展了StatefulWidget{
@凌驾
_imageComparison createState()=>\u imageComparison();
}
类_imageComparison扩展了状态{
摄像机控制器;
列出摄像机;
文件选择图像;
bool-gotImage=false;
文件抓取图像;
人脸检测器;
文件tempImg;
@凌驾
void initState(){
super.initState();
faceDetector=FirebaseVision.instance.faceDetector(FaceDetectorOptions(enableLandmarks:true,enableContours:true,enableClassification:true));
availableCameras()。然后((值){
相机=价值;
控制器=摄像机控制器(摄像机[1],分辨率预设.medium);
controller.initialize()。然后((){
如果(!已安装){
返回;
}
setState((){});
});
});
}
@凌驾
小部件构建(构建上下文){
如果(控制器==null){
返回脚手架(
背景颜色:Colors.white,
主体:容器(),
);
}
如果(!gotImage){
文件img;
下载图像(imageURLs[0],'verificationImage.jpg')。然后((值){
img=tempImg=值;
提取面(img)。然后((值2){
打印(“获得图像”);
gotImage=true;
setState((){});
});
});
}
返回脚手架(
背景颜色:Colors.white,
正文:ModalProgressHUD(
inAsyncCall:globals.showSpinner,
子:容器(
宽度:globals.SizeConfig.blockSizeHorizontal*100,
高度:globals.SizeConfig.blockSizeVertical*100,
装饰:盒子装饰(
梯度:梯度,
),
子:堆栈(
儿童:[
定位(
左:globals.SizeConfig.blockSizeHorizontal*10,
顶部:globals.SizeConfig.blockSizeVertical*5,
子:列(
儿童:[
扁平按钮(
子:文本(
“检查”,
textAlign:textAlign.center,
样式:TextStyle(颜色:Colors.white,fontSize:globals.SizeConfig.blockSizeHorizontal*4),
),
颜色:颜色,红色,
onPressed:()异步{
bool res=等待获取和分析图像();
//其他东西
},
),
],
),
),
],
),
),
),
);
}
Future takeAndAnalyseImage()异步{
//字符串filepath=wait takePicture();
grabbedImage=File((wait ImagePicker().getImage(source:ImageSource.camera)).path);
//grabbedImage=文件(文件路径);
设置状态(){
打印(“设置状态”);
});
while(grabbedImage==null){}
如果(已安装){
extractFace(grabbedImage)。然后((值){
//无关的东西
});
}
返回null;
}
未来提取面(文件img)异步{
FirebaseVisionImage;
visionImage=FirebaseVisionImage.fromFile(img);
Map facevals=Map();
列出面孔;
试一试{
faces=等待faceDetector.processImage(visionImage);
}捕获(e){
print('无法从图像中提取人脸。e='+e.toString());
}
用于(面中面){
//做与问题无关的事情。
}
返回面VAL;
}
}
编辑:将图像转换为
'FirebaseVisionImage'
似乎工作正常-是人脸检测器。processImage
失败…拍摄的图像质量可能导致problem@OreofeSolarin-在什么方面?需要低一点,还是高一点?图像是从相机卷上拍摄的还是作为一张新照片拍摄的?但它在android上工作得很好。软件包应该有问题