我正在使用Google Vision Api
进行面部检测。我想在相机中检测到脸部时启用捕捉按钮,否则禁用。它的工作正常,只有问题是当启用了面部按钮时,但面部不可用时,按钮在1 / 1.5秒后禁用,因为在{1}之后调用onDone
Tracker
回调或1.5秒。
private class GraphicFaceTracker extends Tracker<Face> {
private GraphicOverlay mOverlay;
private FaceGraphic mFaceGraphic;
GraphicFaceTracker(GraphicOverlay overlay) {
mOverlay = overlay;
mFaceGraphic = new FaceGraphic(overlay);
}
/**
* Start tracking the detected face instance within the face overlay.
*/
@Override
public void onNewItem(int faceId, Face item) {
mFaceGraphic.setId(faceId);
}
/**
* Update the position/characteristics of the face within the overlay.
*/
@Override
public void onUpdate(FaceDetector.Detections<Face> detectionResults, Face face) {
mOverlay.add(mFaceGraphic);
mFaceGraphic.updateFace(face);
iv.post(new Runnable() {
@Override
public void run() {
iv.setEnabled(true);
}
});
}
/**
* Hide the graphic when the corresponding face was not detected. This can happen for
* intermediate frames temporarily (e.g., if the face was momentarily blocked from
* view).
*/
@Override
public void onMissing(FaceDetector.Detections<Face> detectionResults) {
mOverlay.remove(mFaceGraphic);
}
/**
* Called when the face is assumed to be gone for good. Remove the graphic annotation from
* the overlay.
*/
@Override
public void onDone() {
iv.post(new Runnable() {
@Override
public void run() {
iv.setEnabled(false);
}
});
mOverlay.remove(mFaceGraphic);
}
}
如何快速获得面部不在相机中的回调 禁用按钮。如何消除延迟?
答案 0 :(得分:0)
我可以想到在这种情况下延迟的两个原因:使用&#34; post&#34;在上面的代码和vision API&#34; maxGapFrames&#34;设置。
使用&#34; post&#34;在上面的示例中是正确的,但这也会导致延迟。该按钮不会被更新,直到UI开始执行此排队的runnable。如果应用程序的UI线程忙于做很多事情,那么这可能需要一段时间。有一件事可能有助于降低相机的帧速率或预览尺寸,因为这会降低设备的工作速度,并可能使其更具响应性:
例如:
mCameraSource = new CameraSource.Builder(context, detector)
.setRequestedPreviewSize(640, 480)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedFps(15.0f)
.build();
如果您在应用中使用MultiProcessor或LargestFaceFocingProcessor类,那么还有&#34; maxGapFrames&#34;您可以考虑调整的设置:
例如,您可以像这样设置MultiProcessor:
detector.setProcessor(
new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory())
.setMaxGapFrames(0)
.build());
默认情况下,这会在脸部不再可见的时间之间添加三帧延迟。&#34; onDone&#34;叫做。只有在面部已经消失三帧或更多帧之后才会被调用。但您可以将此设置为零以消除此延迟。
maxGapFrames的目的是避免在&#34;检测到&#34;之间快速振荡。并且&#34;未被发现&#34;状态,因为通常遇到来自未检测到面部的相机的中间模糊帧(即,特别是当没有足够地保持相机时)。但如果这对您的应用来说不是问题,那么将其设置为零应该会有所帮助。