Android Camera AutoFocus on Demand

时间:2011-05-04 03:06:46

标签: android android-camera

内置的摄像机应用程序(就像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();

我为autoFocus()找到的所有例子似乎都是每500毫秒到2000毫秒调用一次,或者在拍摄照片或开始录制之前的一刻。   EVO摄像机应用程序似乎使用传感器或算法来触发autoFocus()。但是,这个autoFocus()触发器完成后效果非常好。有没有人知道如何在需要时按需要触发autoFocus(),例如当相机移近或远离拍摄对象或稍微平移时? 谢谢, 格里

5 个答案:

答案 0 :(得分:23)

自API Level 9(Gingerbread)以来,Android已推出continuous auto focus。它比定期调用Camera.autoFocus更好。

答案 1 :(得分:19)

我的一个应用程序中遇到了同样的问题。

我的解决方案是使用传感器监听器,并在用户将设备震动到某个阈值时进行自动对焦。这是代码。

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;

}

您可以在此处查看完整的项目:http://adblogcat.com/a-camera-preview-with-a-bounding-box-like-google-goggles/

答案 2 :(得分:2)

使用更简单的技术调用重新聚焦非常有可能,如果在摄像机视图中有一个白盒闪光灯(来自代码,而不是真正的盒子),它将快速调用重新聚焦。我拥有EVO 4G并且之前的海报之一是正确的,它不断重新聚焦,而不需要改变自姜饼更新以来所看到的内容。

答案 3 :(得分:2)

拍摄照片时,您可以设置this

  

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

答案 4 :(得分:0)

我会使用SensorEventListener。所有你需要做的就是听到传感器事件,并在手机方向改变了足够的门槛后启动自动对焦。

http://developer.android.com/reference/android/hardware/SensorEventListener.html