Google Vision API示例:获取CameraSource进行对焦

14

我已从这里检出了最新的Google Vision API:

https://github.com/googlesamples/android-vision

我正在一台装有KitKat的LG G2设备上运行它。 我所做的唯一更改是在Gradle文件中更改了minSdkVerion:

...
defaultConfig {
    applicationId "com.google.android.gms.samples.vision.face.multitracker"
    minSdkVersion 19
...

然而它没有聚焦。我该如何让它聚焦呢?

3个回答

21

我修改了CameraSourcePreview(...)构造函数,使其如下:

public CameraSourcePreview(Context context, AttributeSet attrs) {
    super(context, attrs);
    mContext = context;
    mStartRequested = false;
    mSurfaceAvailable = false;

    mSurfaceView = new SurfaceView(context);
    mSurfaceView.getHolder().addCallback(new SurfaceCallback());
    addView(mSurfaceView);
    mSurfaceView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            cameraFocus(mCameraSource, Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
        }
    });
}

private static boolean cameraFocus(@NonNull CameraSource cameraSource, @NonNull String focusMode) {
    Field[] declaredFields = CameraSource.class.getDeclaredFields();

    for (Field field : declaredFields) {
        if (field.getType() == Camera.class) {
            field.setAccessible(true);
            try {
                Camera camera = (Camera) field.get(cameraSource);
                if (camera != null) {
                    Camera.Parameters params = camera.getParameters();
                    params.setFocusMode(focusMode);
                    camera.setParameters(params);
                    return true;
                }

                return false;
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

            break;
        }
    }

    return false;
}

这里给出了建议:https://github.com/googlesamples/android-vision/issues/2

参考代码在此处:https://gist.github.com/Gericop/7de0b9fdd7a444e53b5a

我还必须修改FaceTrackerFactory的draw(Canvas ...)方法:

@Override
public void draw(Canvas canvas) {
    Face face = mFace;
    if (face == null) {
        return;
    }

    // Draws a circle at the position of the detected face, with the face's track id below.
    float cx = translateX(face.getPosition().x + face.getWidth() / 2);
    float cy = translateY(face.getPosition().y + face.getHeight() / 2);
    canvas.drawCircle(cx, cy, FACE_POSITION_RADIUS, mFacePositionPaint);
    canvas.drawText("id: " + getId(), cx + ID_X_OFFSET, cy + ID_Y_OFFSET, mIdPaint);

    // Draws an oval around the face.
    float xOffset = scaleX(face.getWidth() / 2.0f);
    float yOffset = scaleY(face.getHeight() / 2.0f);
    float left = cx - xOffset;
    float top = cy - yOffset;
    float right = cx + xOffset;
    float bottom = cy + yOffset;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        canvas.drawOval(left, top, right, bottom, mBoxPaint);
    } else {
        canvas.drawCircle(cx, cy, Math.max(xOffset, yOffset), mBoxPaint);
    }
}

能否更改图像大小?由于我们只有具有某些图像大小的CameraSourcePreview,而没有相机对象来获取可能的图像大小。 - Zookey
java.lang.RuntimeException: setParameters 失败 - Konstantin Konopko

12
现在官方API中提供了自动对焦选项。请查看此处的setAutoFocusEnabled方法:

https://developers.google.com/android/reference/com/google/android/gms/vision/CameraSource.Builder.html#setAutoFocusEnabled(boolean)

此外,我们开源了CameraSource类,其中包含自动对焦方法。这个方法允许您设置特定的对焦模式,而不是官方API默认的“连续视频”模式。

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/CameraSource.java


1
请问哪个版本的Google Play服务将拥有这个功能,我们可以期待什么时候发布? - Mark
自动对焦在4.1.2版本仍无法正常工作(play-services-vision:9.2.1) - Konstantin Konopko
在三星4上的4.2.2也不起作用(play-services 9.4)。 - Kenny

9
这对我有用,使用Google Play服务8.4: 'com.google.android.gms:play-services:8.4.0'
cameraSource = new CameraSource.Builder(this, detector).setRequestedPreviewSize(640, 480).setAutoFocusEnabled(true).build();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接