Android开发(51) 摄像头自动对焦。在OpenCV图像识别中连续拍照时自动对焦和拍照。
概述
对焦,这里所说的“焦”是指“焦距”。在拍照时,一定是需要调焦的。一般会在目标位置最清晰的时候会停止对焦。最近在处理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图像识别中连续拍照时自动对焦和拍照。的更多相关文章
- 【Android开发-8】生命周期,Activity中打开另外一个Activity
前言:生命中有很多人陪伴自己走过一生中的某段旅程,仅仅是有些人仅仅是某阶段出现,有些人却陪伴自己非常久.就像小学.中学.高中.大学,那些以前以为会长久拥有的,当经历过天涯各地地忙碌于生活,或如意.或失 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——问题集:.geodatabase创建,创建时内容缺失问题总结
1.前言 利用ArcGIS桌面提供的share as -> ArcGIS Runtiem Content工具在导出.geodatabase文件时经常会发生数据缺失问题,比如数据表中数据有4w多条 ...
- Android开发——异步任务中Activity销毁时的问题
0. 前言 在Android开发中经常会发生Activity的销毁重建,比如用户长时间接听一个电话后回到APP.在Android开发--Fragment知识整理(二)中我们提到了使用Fragment ...
- Android开发——Fragment知识整理(二)
0. 前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...
- Windows下Ionic Android开发环境搭建
转自 http://www.itwap.net/ArticleContent.aspx?id=26 来源: itwap.net 作者: 词略 时间: 2015-4-2 16:57:28 (一)Ioni ...
- 搭建最新版本的Android开发环境
只为成功找方法,不为失败找借口! Android开发学习总结(一)——搭建最新版本的Android开发环境 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Andr ...
- 20145311实验四 "Android开发基础"
20145311实验四 "Android开发基础" 程序设计过程 实验内容 ·安装Android Studio·运行安卓AVD模拟器·使用安卓运行出虚拟手机并显示HelloWorl ...
- Android开发——LinearLayout和RelativeLayout的性能对比
0. 前言 我们都知道新建一个Android项目自动生成的Xml布局文件的根节点默认是RelativeLayout,这不是IDE默认设置,而是由android-sdk\tools\templates\ ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)
1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...
随机推荐
- synchronized同步锁+单利模式
public static synchronized VolleyRequestController getInstance() { if (sInstance == null) { ...
- 从“程序员转行卖烧饼”想到IT人创业
我的一个朋友最近总在跟我念叨着“我不想做开发了,整天累死累活写程序,也攒不下几个钱.我想辞职搞点啥!” 我问他:“你想搞点啥?”. 他说:“搞啥都比做开发强,做个网站赚广告费,接私活……实在不行我去卖 ...
- Linux在Hyper-V中实现与Windows的宽带共享上网
相信不少读者都会做(或者曾经做过)这么一项活动——把一个Linux系统安装到Windows系统下的虚拟机软件中,然后在Windows这个大环境中对Linux进行学习或者一些实验操作.在进行这么一项活动 ...
- Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置
上次介绍了<Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示> 以及如何配置自定义审批流的按钮:<Dynamic CRM 2013学习笔记(二十一)自定义 ...
- [MFC] MFC编译程序,缺少MFC动态链接库的解决
问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等的解决方法 解决方法: 1.将这些dll打包,和应用程序一起发布; 2.采用MFC静态 ...
- AngularJS 源码分析3
本文接着上一篇讲 上一篇地址 回顾 上次说到了rootScope里的$watch方法中的解析监控表达式,即而引出了对parse的分析,今天我们接着这里继续挖代码. $watch续 先上一块$watch ...
- paip.提升性能----jvm参数调整.txt
paip.提升性能----jvm参数调整.txt 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.n ...
- Spark Scala 读取GBK文件的方法
1. 在生产环境下,很多文件是GBK编码格式的,而SPARK 常用的textFile方法默认是写死了读UTF-8格式的文件,其他格式文件会显示乱码 用如下代码实现读取GBK文件的方法 import o ...
- [转] java.lang.IllegalArgumentException: Document base D:\apache-tomcat-7.0.47\webapps\XXX错误
启动服务器,报上述错误,是因为在服务器中(如tomcat)删除了某项目,单残留的配置文件没删除造成的.解决办法是到服务器中找到conf\Catalina\localhost下找到错误信息中对应的配置文 ...
- windows下clang的安装与使用
我本意是想在windows下学习下C++11,而结果是我的Visual Studio 2012不完全支持,而我又懒得去安装2013/2015,太大了.公司运维也不允许我去下载- -,然后就想能不能在w ...