如何手动控制Camera2的手动对焦? [英] How to manually control Camera2 manual focus?
问题描述
我的手机支持所有手动配置.经过( https://github.com/pinguo-yuyidong/Camera2 的测试)使用搜索栏进行调整.
My phone support all manual configuration. Tested with (https://github.com/pinguo-yuyidong/Camera2) which allow us to adjust using seekbar.
我想在开始预览之前在镜头焦距"中设置一个固定值,直到关闭应用程序.
I want to set a fix value in Lens Focus Distance when preview is started until I close the app.
将自动对焦模式设置为关闭后,将镜头焦距设置为一个值.预览没有任何效果,但是Focus 2值已更改.
After I set AF mode to off and set the Lens Focus Distance with a value. The preview does not show any effect but the Focus 2 value is changed.
我该如何克服这个问题?
How can I overcome this problem?
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
Output
Focus 1 ====== 0.0
焦点2 ====== 7.5
Focus 2 ====== 7.5
更改值时看不到差异.
推荐答案
找到了答案
不确定为什么我需要mPreviewRequest和setRepeatingRequest 2次,但是它可以工作.
Found the answer
Not sure why I need to mPreviewRequest and setRepeatingRequest 2 times but it works.
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);
这篇关于如何手动控制Camera2的手动对焦?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!