概述

  对焦,这里所说的“焦”是指“焦距”。在拍照时,一定是需要调焦的。一般会在目标位置最清晰的时候会停止对焦。最近在处理OpenCV进行图像识别时,需要连续的调焦(对焦),并在对焦完成后进行拍照,获取图片后进行图像识别。识别完成后摄像头不关闭继续进行扫描识别。整理成本文。

概念

焦距,也称为焦长,是光学系统中衡量光的聚集或发散的度量方式,指从透镜中心到光聚集之焦点的距离。亦是照相机中,从镜片光学中心到底片、CCD或CMOS等成像平面的距离。具有短焦距的光学系统比长焦距的光学系统有更佳聚集光的能力。
相机的镜头是一组透镜,当平行于主光轴的光线穿过透镜时,光会聚到一点上,这个点叫做焦点,焦点到透镜中心(即光心)的距离,就称为焦距。焦距固定的镜头,即定焦镜头;焦距可以调节变化的镜头,就是变焦镜头。(当一束与凸透镜的主轴平行的光穿过凸透镜时,在凸透镜的另一侧会被凸透镜汇聚成一点,这一点叫做焦点,焦点到凸透镜光心的距离就叫这个凸透镜的焦距。一个凸透镜的两侧各有一个焦点。)

基础知识

  想实现对焦,先了解下Android系统的拍照API为我们提供了什么。 Camera 类位于 android.hardware 命名空间下,它提供了操作相机的一些方法。

  Camera类提供了自动对焦的方法,它接收一个 AotoFocusCallback的回调。这个方法执行后就相机就会自动对焦,当它对焦完成后(成功或失败)触发回调。

  public final void autoFocus(AutoFocusCallback cb);

下面是Callback接口,它的 onAutoFocus方法回调 有个boolean的参数 success,该参数指示了自动对焦的成功或者失败。

public interface AutoFocusCallback
{
    void onAutoFocus(boolean success, Camera camera); 
}

具体实现

声明权限

在文档里我们可以看到这么句话,if you use the camera and auto-focus feature, your Manifest should include the following:

如果你使用了相机和自动对焦特性,你的Manifest需要包含下面这些:
  < uses-permission android:name="android.permission.CAMERA" />
  < uses-feature android:name="android.hardware.camera" />
  < uses-feature android:name="android.hardware.camera.autofocus" />

打开你的manifest.xml,写入上面的内容,以声明你的app要使用的权限。

定义变量

  我们需要一个定时器 Timer,它会每个一段时间执行一个 TimerTask,我们在TimerTask里执行 对焦方法

private final Timer timer;
private TimerTask outstandingTask;
private static final long AUTO_FOCUS_INTERVAL_MS = 3500L; timer = new Timer(true); outstandingTask = new TimerTask() {
@Override
public void run() {
start();
}
};
timer.schedule(outstandingTask, AUTO_FOCUS_INTERVAL_MS);

执行对焦

  注意下面代码里我们自己实现的回调,this 是指自己实现了回调,我们需要自己实现回调方法并再次启动 Timer,以实现连续(间隔)自动对焦

synchronized void start() {
try {
camera.autoFocus(this);
} catch (RuntimeException re) {
// Have heard RuntimeException reported in Android 4.0.x+; continue?
Log.w(TAG, "Unexpected exception while focusing", re);
}
}

停止对焦

camera.cancelAutoFocus();

连续对焦

  下面代码是对焦的回调实现,在对焦完成后(成功或者失败)我们都再次启动TimerTask 来检查和启动自动对焦

 @Override
public synchronized void onAutoFocus(boolean success, Camera theCamera) { outstandingTask = new TimerTask() {
@Override
public void run() {
checkAndStart();
}
};
timer.schedule(outstandingTask, AUTO_FOCUS_INTERVAL_MS); if (success) {
Log.i(TAG, "### onAutoFocus success ***************** ");
raiseEvent_OnAutoFocusSuccess();
}
manual = false;
}

对焦成功后拍照

  在上面的代码中, 触发了 写了一个raiseEvent_OnAutoFocusSuccess 方法,它判断对焦成功后执行,我们可以在这个方法里最自己的实现。比如 在这里执行拍照。一般情况下,我们会在这里发出一个消息或者在声明一个回调来间接执行拍照。

  

Android开发(51) 摄像头自动对焦。在OpenCV图像识别中连续拍照时自动对焦和拍照。的更多相关文章

  1. 【Android开发-8】生命周期,Activity中打开另外一个Activity

    前言:生命中有很多人陪伴自己走过一生中的某段旅程,仅仅是有些人仅仅是某阶段出现,有些人却陪伴自己非常久.就像小学.中学.高中.大学,那些以前以为会长久拥有的,当经历过天涯各地地忙碌于生活,或如意.或失 ...

  2. 《ArcGIS Runtime SDK for Android开发笔记》——问题集:.geodatabase创建,创建时内容缺失问题总结

    1.前言 利用ArcGIS桌面提供的share as -> ArcGIS Runtiem Content工具在导出.geodatabase文件时经常会发生数据缺失问题,比如数据表中数据有4w多条 ...

  3. Android开发——异步任务中Activity销毁时的问题

    0.  前言 在Android开发中经常会发生Activity的销毁重建,比如用户长时间接听一个电话后回到APP.在Android开发--Fragment知识整理(二)中我们提到了使用Fragment ...

  4. Android开发——Fragment知识整理(二)

    0.  前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...

  5. Windows下Ionic Android开发环境搭建

    转自 http://www.itwap.net/ArticleContent.aspx?id=26 来源: itwap.net 作者: 词略 时间: 2015-4-2 16:57:28 (一)Ioni ...

  6. 搭建最新版本的Android开发环境

    只为成功找方法,不为失败找借口! Android开发学习总结(一)——搭建最新版本的Android开发环境 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Andr ...

  7. 20145311实验四 "Android开发基础"

    20145311实验四 "Android开发基础" 程序设计过程 实验内容 ·安装Android Studio·运行安卓AVD模拟器·使用安卓运行出虚拟手机并显示HelloWorl ...

  8. Android开发——LinearLayout和RelativeLayout的性能对比

    0. 前言 我们都知道新建一个Android项目自动生成的Xml布局文件的根节点默认是RelativeLayout,这不是IDE默认设置,而是由android-sdk\tools\templates\ ...

  9. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)

    1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...

随机推荐

  1. elixir 高可用系列(四) Task

    概述 之前学习的 Agent,GenSever以及GenEvent,都是用来管理状态或者处理消息的. 但是在很多时候,我们需要的是执行某个任务,这时如果使用 GenSever 或者 GenEvent, ...

  2. MongoDB新增及查询数据(一)

    新增操作    insert函数会添加一个文档到集合里面.例如我们要登记一个人的信息,首先我们在shell力创建一个局部变量person,其记录了人的姓名和性别,我们通过db.persons.inse ...

  3. Linux上成功编译CoreCLR源代码

    >>Build日期:2015-2-5下午(编译失败). 开始Linux发行版用的是CentOS 6.5,操作步骤: 1)配置git: git config --global http.ss ...

  4. ASP.NET的一次奇遇:UserControl写成Control引发的w3wp进程崩溃

    昨天在写代码中一不小心将UserControl写成了Control,将原来应该继承自System.Web.UI.UserControl的用户控件,比如下面的BlogStats: <%@ Cont ...

  5. [ucgui] 对话框1——创建对话框

    >_<" 小工具和对话框的区别: 小工具可以创建并独立使用,因为它们本质上就是窗口.但是,通常需要使用对话框,它是包含一个或多个小工具的窗口. 对话框通常是一个窗口,它在出现时会 ...

  6. Minifying Angular应用时产生的问题

    一.产生的问题 如果你正在进行AngularJS的项目开发,生产时Minified JS文件有没有遇到下面问题: angular.module("myApp", []) .cont ...

  7. 【转】关于KDD Cup '99 数据集的警告,希望从事相关工作的伙伴注意

    Features From: Terry Brugger Date: 15 Sep 2007 Subject: KDD Cup '99 dataset (Network Intrusion) cons ...

  8. 记录js的一些小技巧

    1.取数组最大值,最小值 Math.max.apply(null,[1,2,3,32,3]); Math.min.apply(null,[1,2,3,32,3]); 2.旧版IE setTimeout ...

  9. 【转】Oracle 执行动态语句

    1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一 ...

  10. QueryTask查询结果最多500条的问题

    参考: http://dingtao-wgs.blog.163.com/blog/static/5026071420129813059865/ 上面文章中给出的解决方法:今天在做querytask的时 ...