Android摄像头按需自动对焦

Android摄像头按需自动对焦,android,android-camera,Android,Android Camera,内置摄像机应用程序(如HTC EVO上的应用程序)似乎只在预览图像更改时才调用camera.autoFocus()。如果您将相机保持稳定,则不会发生任何camera.autoFocus()。 当camera.startPreview()处于活动状态时,我想复制此行为,如下面的初始预览设置代码所示: camera = camera.open(); Camera.Parameters parameters = camera.getParameters(); List<String> fo

内置摄像机应用程序(如HTC EVO上的应用程序)似乎只在预览图像更改时才调用
camera.autoFocus()
。如果您将相机保持稳定,则不会发生任何
camera.autoFocus()

camera.startPreview()
处于活动状态时,我想复制此行为,如下面的初始预览设置代码所示:

camera = camera.open();
Camera.Parameters parameters = camera.getParameters();
List<String> focusModes = parameters.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))
{
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
camera.setParameters(parameters);
camera.setPreviewDisplay(holder);
camera.startPreview();
camera=camera.open();
Camera.Parameters=Camera.getParameters();
List focusModes=parameters.getSupportedFocusModes();
if(focusModes.contains(Camera.Parameters.FOCUS\u MODE\u AUTO))
{
parameters.setFocusMode(相机.参数.聚焦模式自动);
}
设置参数(参数);
摄像头。设置预览显示(支架);
camera.startPreview();
我找到的所有有关
autoFocus()
的示例似乎都是每500毫秒到2000毫秒调用一次,或者在拍照或录制开始前的一瞬间调用一次。
EVO摄像机应用程序似乎使用传感器或算法来触发
自动对焦()。然而,这个
autoFocus()
触发器已经完成,它工作得非常好。是否有人知道在需要时如何按需触发
autoFocus()
,例如当相机靠近或远离拍摄对象或稍微平移时? 非常感谢。
Gerry

我会利用SensorEventListener。你所需要做的就是监听传感器事件,一旦手机方向改变了足够的阈值,启动自动对焦


Android从API 9级(姜饼)开始引入。它比定期调用Camera.autoFocus效果更好

我的一个应用程序也有同样的问题

我的解决方案是使用传感器侦听器,当用户将设备摇晃到某个阈值时自动对焦。这是代码

public void setCameraFocus(AutoFocusCallback autoFocus){
if (mCamera.getParameters().getFocusMode().equals(mCamera.getParameters().FOCUS_MODE_AUTO) ||
        mCamera.getParameters().getFocusMode().equals(mCamera.getParameters().FOCUS_MODE_MACRO)){
    mCamera.autoFocus(autoFocus);
}
}

自动对焦的回调:

// this is the autofocus call back
private AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){

    public void onAutoFocus(boolean autoFocusSuccess, Camera arg1) {
        //Wait.oneSec();
        mAutoFocus = true;
    }};
这就是所谓的焦点

public void onSensorChanged(SensorEvent event) {

if (mInvalidate == true){
    mView.invalidate();
    mInvalidate = false;
}
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
if (!mInitialized){
    mLastX = x;
    mLastY = y;
    mLastZ = z;
    mInitialized = true;
}
float deltaX  = Math.abs(mLastX - x);
float deltaY = Math.abs(mLastY - y);
float deltaZ = Math.abs(mLastZ - z);

if (deltaX > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing)
    mAutoFocus = false;
    mPreview.setCameraFocus(myAutoFocusCallback);
}
if (deltaY > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing)
    mAutoFocus = false;
    mPreview.setCameraFocus(myAutoFocusCallback);
}
if (deltaZ > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing) */
    mAutoFocus = false;
    mPreview.setCameraFocus(myAutoFocusCallback);
}

mLastX = x;
mLastY = y;
mLastZ = z;
}


您可以在这里看到完整的项目:

使用更简单的技术调用重新聚焦是非常可能的,如果您在相机视图中有一个白盒闪光灯(来自代码,而不是真实的框),它将快速调用重新聚焦。我拥有EVO 4G,之前的一张海报是正确的,自从姜饼更新以来,它不需要改变它的外观就可以不断地重新聚焦。

对于拍照,您可以设置

在此模式下,应用程序可以调用
自动对焦(AutoFocusCallback)
。如果自动对焦在扫描的中间,则焦点回调将在完成时返回。如果自动对焦未扫描,则调焦回调将立即返回一个布尔值,指示调焦是否清晰。然后,应用程序可以决定是立即拍照,还是将对焦模式更改为自动,并运行完整的自动对焦循环


如果(mAutoFocus&&(deltaX>.5 | | | deltaY>.5 | | | deltaZ>.5))
也可以做得很好一些HTC设备甚至API>9也不支持连续自动对焦。使用parameters.getSupportedFocusModes().contains(Camera.parameters.FOCUS\u MODE\u CONTINUOUS\u VIDEO)检查它是否受支持。@d2vid,这是真的。我是在API 15 HTC上开发的,它不支持连续自动对焦!从2018年开始写作——不,Android自动对焦并不比在大多数设备上定期轮询自动对焦更好,尤其是在近距离物体上。