概述

  对焦,这里所说的“焦”是指“焦距”。在拍照时,一定是需要调焦的。一般会在目标位置最清晰的时候会停止对焦。最近在处理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. 【基础知识】Sql和Ado.Net第12天

    一. 主键(PrimaryKey) 1. 主键是数据行的唯一标识.不能重复,不可为空,主键建议选择一般不会修改的列! 2. 主键的作用:保证表中的每条数据的唯一性. 3. 主键的分类: a) 逻辑主键 ...

  2. 安卓系统上安装.net运行时 mono runtime

    感谢以下博主: ubuntu指南 http://dawndiy.com/archives/229/ img大小调整 http://zebinj.blog.163.com/blog/static/206 ...

  3. JS DOM操作

    一.DOM基础 1.节点(node)层次 Document--最顶层的节点,所有的其他节点都是附属于它的. DocumentType--DTD引用(使用<!DOCTYPE>语法)的对象表现 ...

  4. jQuery插件之验证控件jquery.validate.js

    今天学习一下jQuery.Validate插件,为便于日后翻阅查看和广大博客园园友共享,特记于此. 本博客转载自:jQuery Validate jQuery Validate 插件为表单提供了强大的 ...

  5. os.popen(command)

    command="/usr/local/sbin/xxx_cmd" os.popen(command) xxx_cmd是自己编译的二进制文件,如果不加上全路径/usr/local/ ...

  6. Linux:文件类型和权限

    一个目录要同时具有读权限和执行权限才可以打开,而一个目录要有写权限才允许在其中创建其它文件.

  7. 浅谈压缩感知(三十一):压缩感知重构算法之定点连续法FPC

    主要内容: FPC的算法流程 FPC的MATLAB实现 一维信号的实验与结果 基于凸优化的重构算法 基于凸优化的压缩感知重构算法. 约束的凸优化问题: 去约束的凸优化问题: 在压缩感知中,J函数和H函 ...

  8. 菜鸟学习WCF笔记-契约(Contract)

    契约,契约确保了服务的正常调用,客户端以契约的方式进行服务端调用,而服务则需要按照契约规定的方式提供服务. 契约是服务提供的一组操作的描述 功能上讲:每个操作对应着某个具体的功能实现,以及调用这个操作 ...

  9. 优化TableView性能

    优化tableView性能(针对滑动时出现卡的现象) (2013-08-02 11:18:15) 转载▼ 标签: ios tableview it 分类: 技术文档 在iOS应用中,UITableVi ...

  10. python web框架——初识tornado

    一 Tornado概述 Tornado是FriendFeed使用的可扩展的非阻塞式web框架及其相关工具的开源版本.这个Web框架看起来有些像web.py或者Google的 webapp,不过为了能有 ...