java - 如何手动控制Camera2手动对焦?
问题描述
问题
我的手机支持所有手动配置。使用 ( https://github.com/pinguo-yuyidong/Camera2 ) 测试,允许我们使用 seekbar 进行调整。
我想在预览开始时在镜头焦距中设置一个固定值,直到我关闭应用程序。
在我将自动对焦模式设置为关闭并使用值设置镜头焦距之后。预览不显示任何效果,但焦点 2 值已更改。
我该如何克服这个问题?
示例代码 (Java)
private CaptureRequest mPreviewRequest;
private void startCameraPreview() throws CameraAccessException {
SurfaceTexture texture = textureview.getSurfaceTexture();
texture.setDefaultBufferSize(imageDimensions.getWidth(), imageDimensions.getHeight());
Surface surface = new Surface(texture);
mPreviewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
System.out.println("Focus 1 ====== "+mPreviewRequestBuilder.get(CaptureRequest.LENS_FOCUS_DISTANCE));
cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
if (cameraDevice == null) {
return;
}
cameraSession = session;
try {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_OFF);
mPreviewRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 7.5f);
mPreviewRequest = mPreviewRequestBuilder.build();
cameraSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, backgroundHandler);
System.out.println("Focus 2 ====== "+mPreviewRequestBuilder.get(CaptureRequest.LENS_FOCUS_DISTANCE));
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
Toast.makeText(getApplicationContext(),"Failed",Toast.LENGTH_SHORT).show();
}
}, null);
}
private static final int STATE_PREVIEW = 0;
private int mState = STATE_PREVIEW;
private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() {
private void process(CaptureResult result){
switch(mState){
case STATE_PREVIEW:{
break;
}
}
}
};
输出
焦点 1 ====== 0.0
重点2 ====== 7.5
更改值时看不到差异。
解决方案
找到了答案
不知道为什么我需要 mPreviewRequest 和 setRepeatingRequest 2 次,但它有效。
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_OFF);
mPreviewRequest = mPreviewRequestBuilder.build();
cameraSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, backgroundHandler);
mPreviewRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 7.5f);
mPreviewRequest = mPreviewRequestBuilder.build();
cameraSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, backgroundHandler);
推荐阅读
- javascript - 基于标签的可变背景颜色 Chart.js
- matlab - 将代码转换为 xcorr 函数的 hdl 时出现 MATLAB 编码器错误
- java - 为什么即使使用 @JsonIgnoreProperties 在使用 jackson 时也会出现 stackoverflow 错误
- java - Java 仅在有人讲话时录制音频
- python - Django 传递参数
- xamarin.forms - 部署时有什么方法可以为 APK 设置密码?
- xml - 提取 XML 片段以用作带有前缀 mods 的输出
- python - 按索引连接两个数据框
- java - 并行请求的 NullPointer 异常
- python - 将 IR 加载到插件时,ssd_resnet50 模型卡住