我面临着移动视觉的问题,面部检测器非常慢,这是我在不是onCreate的函数中运行代码的时候。检测在14秒后完成。但是当我第一次在onCreate中运行检测代码时,它会在一秒钟内加载。我试过这个Google Mobile Vision: Poor FaceDetector performance without CameraSource。我已经看了这篇文章mobile vision API takes too long to detect face,但答案是关于位图,这不是问题。下面给出了有关场景的更多信息。
在方案1中,我在点击按钮后开始检测。但是第一次运行探测器时,延迟时间为14或15秒。第二次运行探测器时,它会在1秒内运行。内存和CPU似乎正常。 这是代码:
private ImageButton mTakePictureButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTakePictureButton = (ImageButton) findViewById(R.id.take_picture_button);
mTakePictureButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.take_picture_button:
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_example);
SparseArray<Face> faces = getFaceArrayFromBitmap(bmp);//<----
break;
}
}
private SparseArray<Face> getFaceArrayFromBitmap(Bitmap bmp){
FaceDetector detector = new FaceDetector.Builder(this)
.setTrackingEnabled(false)
.setMode(FaceDetector.FAST_MODE)
.setClassificationType(FaceDetector.NO_CLASSIFICATIONS)
.setLandmarkType(FaceDetector.NO_LANDMARKS)
.build();
// Create a frame from the bitmap and run face detection on the frame.
Frame frame = new Frame.Builder().setBitmap(bmp).build();
SparseArray<Face> faceArray = detector.detect(frame);// <--- First time takes 14/15 seconds
detector.release();
return faceArray;
}
在方案2中,我第一次在onCreate中运行面部检测器,运行检测器代码只需1秒钟。
private ImageButton mTakePictureButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTakePictureButton = (ImageButton) findViewById(R.id.take_picture_button);
mTakePictureButton.setOnClickListener(this);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_example);
SparseArray<Face> faces = getFaceArrayFromBitmap(bmp);// <-----
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.take_picture_button:
break;
}
}
private SparseArray<Face> getFaceArrayFromBitmap(Bitmap bmp){
FaceDetector detector = new FaceDetector.Builder(this)
.setTrackingEnabled(false)
.setMode(FaceDetector.FAST_MODE)
.setClassificationType(FaceDetector.NO_CLASSIFICATIONS)
.setLandmarkType(FaceDetector.NO_LANDMARKS)
.build();
// Create a frame from the bitmap and run face detection on the frame.
Frame frame = new Frame.Builder().setBitmap(bmp).build();
SparseArray<Face> faceArray = detector.detect(frame);// <-- Now it takes only 1 second the first time
detector.release();
return faceArray;
}
我还看到了移动视觉的源代码存在一个错误,但这对我来说并不像是一个问题,因为在检测中它不会崩溃。
/ ** *这是面部检测器中的一个错误的解决方法,其中非常小的图像(即, *尺寸大于&lt;的大多数图像147)非常薄的图像可能会导致原生面部崩溃 *检测代码。这将在面部检测之前向这些图像添加填充以避免 *这个问题。
* *对于与相机一起使用不是必需的,因为相机并没有创建这些类型的相机 *图片。
* *此检测器应包装底层的FaceDetector实例,如下所示: * * Detector safeDetector = new SafeFaceDetector(faceDetector); * *用safeDetector替换所有剩余的faceDetector。 * /