前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发(53) 摄像头自动对焦。在OpenCV图像识别中连续拍照时自动对焦和拍照。

Android开发(53) 摄像头自动对焦。在OpenCV图像识别中连续拍照时自动对焦和拍照。

作者头像
张云飞Vir
发布2020-03-16 15:00:42
2.5K0
发布2020-03-16 15:00:42
举报
文章被收录于专栏:写代码和思考

概述

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

概念

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

基础知识

想实现对焦,先了解下Android系统的拍照API为我们提供了什么。 Camera 类位于 android.hardware 命名空间下,它提供了操作相机的一些方法。   Camera类提供了自动对焦的方法,它接收一个 AotoFocusCallback的回调。这个方法执行后就相机就会自动对焦,当它对焦完成后(成功或失败)触发回调。

代码语言:javascript
复制
public final void autoFocus(AutoFocusCallback cb);

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

代码语言:javascript
复制
public interface AutoFocusCallback{    
  void onAutoFocus(boolean success, Camera camera); 
}

具体实现

声明权限

如果你使用了相机和自动对焦特性,你的Manifest需要包含下面这些:

代码语言:javascript
复制
< 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里执行 对焦方法

代码语言:javascript
复制
  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,以实现连续(间隔)自动对焦

代码语言:javascript
复制
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); 
  }
}

停止对焦

代码语言:javascript
复制
camera.cancelAutoFocus();

连续对焦

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

代码语言:javascript
复制
 @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 方法,它判断对焦成功后执行,我们可以在这个方法里最自己的实现。比如 在这里执行拍照。一般情况下,我们会在这里发出一个消息或者在声明一个回调来间接执行拍照。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 概念
  • 基础知识
  • 具体实现
    • 声明权限
      • 定义变量
        • 执行对焦
          • 停止对焦
            • 连续对焦
              • 对焦成功后拍照
              相关产品与服务
              图像识别
              腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档