首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Camera2应用编程接口中实现点击聚焦

在Camera2应用编程接口中实现点击聚焦
EN

Stack Overflow用户
提问于 2015-10-15 22:30:01
回答 3查看 12.6K关注 0票数 12

我想在我的自定义相机中实现轻拍对焦功能。这是Google https://github.com/googlesamples/android-Camera2Basic提供的基本代码。

下面是代码片段,我认为我应该在其中添加我的功能,如果有人已经实现了Camera2应用程序接口,请帮助!

代码语言:javascript
复制
  private void lockFocus() {
    try {
        // This is how to tell the camera to lock focus.
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                CameraMetadata.CONTROL_AF_TRIGGER_START);
        // Tell #mCaptureCallback to wait for the lock.
        mState = STATE_WAITING_LOCK;
        mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                mBackgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}
EN

回答 3

Stack Overflow用户

发布于 2015-10-17 09:03:43

您需要将自动对焦和自动曝光区域设置为用户点击的区域。

密钥是CONTROL_AF_REGIONSCONTROL_AE_REGIONS

它们的单位在传感器active array coordinate system中,因此您必须将UI触摸坐标转换为相对于预览视图的坐标,并从那里转换为活动阵列坐标。

如果预览的纵横比与传感器的纵横比匹配,则很简单;如果不匹配,则必须调整裁剪以创建预览输出。关于裁剪如何工作的最佳图表是目前的here。请注意,如果您还在应用缩放,则需要在计算中也包括缩放因子。

一旦你计算了区域,你可能会想要将自动对焦模式设置为自动(而不是通常用于正常预览的CONTINUOUS_PICTURE ),然后触发自动对焦。一旦你收敛了自动对焦(看看捕捉结果中的自动对焦状态,等待AF_STATE_FOCUSED_LOCKED),你就可以拍一张对焦的照片了。如果您想在一段时间后恢复正常操作,或者用户取消了对焦的触摸,请将AF模式切换回CONTINUOUS_PICTURE。

票数 15
EN

Stack Overflow用户

发布于 2017-02-14 16:45:23

  1. 使用onTouch listener来获取用户根据该位置触摸screen.
  2. Calculate a/MeteringRectangle(s)的位置。使用此计量矩形可将构建捕获请求设置为CaptureRequest.CONTROL_AE_REGION
    1. set to
    2. CaptureRequest.CONTROL_AF_TRIGGER to CameraMetadata.CONTROL_AF_TRIGGER_START
    3. CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER to CameraMetadata.CONTROL_AE_TRIGGER_START
    4. Then
    5. CaptureRequest.CONTROL_AF_REGION CaptureRequest.CONTROL_AF_MODE

Here你可以找到一个完整的例子。

票数 4
EN

Stack Overflow用户

发布于 2019-01-02 15:57:29

代码语言:javascript
复制
 public void handleFocus(MotionEvent event) {
    int pointerId = event.getPointerId(0);
    int pointerIndex = event.findPointerIndex(pointerId);
    // Get the pointer's current position
    float x = event.getX(pointerIndex);
    float y = event.getY(pointerIndex);

    Rect touchRect = new Rect(
            (int) (x - 100),
            (int) (y - 100),
            (int) (x + 100),
            (int) (y + 100) );


    if (mCameraId == null) return;
    CameraManager cm = (CameraManager)this.getSystemService(Context.CAMERA_SERVICE);
    CameraCharacteristics cc = null;
    try {
        cc = cm.getCameraCharacteristics(mCameraId);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }


    MeteringRectangle focusArea = new MeteringRectangle(touchRect,MeteringRectangle.METERING_WEIGHT_DONT_CARE);
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
    try {
        mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                mBackgroundHandler);
        // After this, the camera will go back to the normal state of preview.
        mState = STATE_PREVIEW;
    } catch (CameraAccessException e){
        // log
    }

    /* if (isMeteringAreaAESupported(cc)) {
     *//*mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS,
                new MeteringRectangle[]{focusArea});*//*
    }
    if (isMeteringAreaAFSupported(cc)) {
        *//*mPreviewRequestBuilder
                .set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea});
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                CaptureRequest.CONTROL_AF_MODE_AUTO);*//*
    }*/
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS,
            new MeteringRectangle[]{focusArea});
    mPreviewRequestBuilder
            .set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea});
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
            CameraMetadata.CONTROL_AF_TRIGGER_START);
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
            CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);
    try {
        mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback,
                mBackgroundHandler);
        /* mManualFocusEngaged = true;*/
    } catch (CameraAccessException e) {
        // error handling
    }
}

在averide on touch中调用触摸事件方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33151244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档