转至 http://blog.csdn.net/think_soft/article/details/7998478

使用Camera功能

大多数的Camera功能都是使用Camera.Parameters对象来激活和控制的。首先要通过Camera对象实例的getParameters()方法,来获取这个对象,然后把修改后的参数对象再设置给Camera对象,以下示例代码演示了这个操作:

// get Camera parameters

Camera.Parameters params = mCamera.getParameters();

// set the focus mode

params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

// set Camera parameters

mCamera.setParameters(params);

这种技术几乎使用所有的Camera功能,并且在获得Camera对象示例之后的任何时候,大多数参数都是可以被改变的。通常,参数的改变要立即在应用程序的Camera预览窗口中显示给用户。在软件方面,会因为硬件处理新指令的影响,参数改变时实际上会有几帧的延迟,然后才会发送更新后的图像数据。

重要:某些Camera功能不能随意改变。尤其是改变Camera预览窗口的尺寸和方向,需要首先终止图像预览,改变预览窗口尺寸后,再重启图像预览窗口。从Android4.0(API Level14)开始,改变预览窗口的方向时,不需要在重启预览窗口了。

需要更多的代码才能实现的Camera功能包括:

1.测光和调焦;

2.面部识别;

3.延时摄影。

测光和调焦

在某些摄像情景中,自动调焦和测光可能不能达到设计结果。从Android4.0(API Level 14)开始,你的Camera应用程序能够提供另外的控制允许应用程序或用户指定图像中特定区域用于进行调焦或光线级别的设置,并且把这些值传递给Camera硬件用于采集图片或视频。

测光和调焦区域的工作与其他Camera功能非常类似,你可以通过Camera.Parameters对象中的方法来控制它们。下列代码演示如何给Camera示例设置两个测光区域:

// Create an instance of Camera

mCamera = getCameraInstance();

// set Camera parameters

Camera.Parameters params = mCamera.getParameters();

if (params.getMaxNumMeteringAreas() > 0){ // check that metering areas are supported

List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();

Rect areaRect1 = new Rect(-100, -100, 100, 100);    // specify an area in center of image

meteringAreas.add(new Camera.Area(areaRect1, 600)); // set weight to 60%

Rect areaRect2 = new Rect(800, -1000, 1000, -800);  // specify an area in upper right of image

meteringAreas.add(new Camera.Area(areaRect2, 400)); // set weight to 40%

params.setMeteringAreas(meteringAreas);

}

mCamera.setParameters(params);

Camera.Area对象包含了两个数据参数:Rect对象,它用于指定Camera预览窗口一块矩形区域;一个权重值:它告诉Camera这块指定区域应该给予的测光或调焦计算的重要性等级。
在Camera.Area对象中的Rect字段,代表了一个被映射成2000x2000单元格的矩形。坐标(-1000,-1000)代表Camera图像的左上角,(1000,1000)代表Camera图像的右下角,如下图所示:

图1.图中的红线说明了在Camera预览窗口中给Camera.Area指定的坐标系统。用Rect的值是(333,333,667,667)蓝色框显示了摄像区域的位置和形状。

这个坐标系统的边框总是对应着Camera预览窗口中所显示的图像的外边缘,并且不会使用缩放级别来缩小或放大。类似的,使用Camera.setDisplayOrientation()方法来选择图像的预览,不会重新映射坐标系统。

面部识别

对于包含人的图片,通常人脸是图片的最重要的部分,并且在采集图像时,应该使用调焦和白平衡来进行检测。Android4.0(API Level 14)框架提供了用于识别人脸和使用人脸识别技术来计算图片设置的API。

注意:在运行面部识别功能时,setWiteBalance(String),setFocusAreas(List)和setMeteringAreas(List)方法没有影响。

在你的Camera应用程序中使用面部识别技术,一般需要以下几步:

1.检查设备是否支持面部识别;

2.创建一个面部识别的监听器;

3.把面部识别监听器添加给你的Camera对象;

4.在预览开始之后(并且在每次重启预览窗口之后)都要启动面部识别。

面部识别的功能不是所有的设备都支持的。通过调用getMaxNumDetectedFaces()方法能够检测到设备是否支持这个功能。在下面示例的startFaceDetection()方法用于该功能的检查。

为了通知和响应面部的识别,你的Camera应用程序设置一个响应面部识别事件的监听器。为了到达这个目的,你必须要创建一个实现Camera.FaceDetectionListener接口的监听器类,如下所示:

class MyFaceDetectionListener implements Camera.FaceDetectionListener {

@Override

public void onFaceDetection(Face[] faces, Camera camera) {

if (faces.length > 0){

Log.d("FaceDetection", "face detected: "+ faces.length +

" Face 1 Location X: " + faces[0].rect.centerX() +

"Y: " + faces[0].rect.centerY() );

}

}

}

创建这个类之后,把它设置给你的应用程序的Camera对象:

mCamera.setFaceDetectionListener(newMyFaceDetectionListener());

你的应用在每次启动Camera预览窗口(含重启)时,都要启动面部识别。创建一个用于启动面部识别的方法,以便在需要的时候来调用它,如下代码所示:

public void startFaceDetection(){

// Try starting Face Detection

Camera.Parameters params = mCamera.getParameters();

// start face detection only *after* preview has started

if (params.getMaxNumDetectedFaces() > 0){

// camera supports face detection, so can start it:

mCamera.startFaceDetection();

}

}

你必须在每次启动(或重启)Camera预览窗口时都要启动面部识别。如果你使用前文“创建预览类”中的预览类,就要把startFaceDetection()方法添加到预览类的surfaceCreated()和surfaceChanged()方法中,如下代码所示:

public void surfaceCreated(SurfaceHolder holder) {

try {

mCamera.setPreviewDisplay(holder);

mCamera.startPreview();

startFaceDetection(); // start face detection feature

} catch (IOException e) {

Log.d(TAG, "Error setting camera preview: " + e.getMessage());

}

}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

if (mHolder.getSurface() == null){

// preview surface does not exist

Log.d(TAG, "mHolder.getSurface() == null");

return;

}

try {

mCamera.stopPreview();

} catch (Exception e){

// ignore: tried to stop a non-existent preview

Log.d(TAG, "Error stopping camera preview: " + e.getMessage());

}

try {

mCamera.setPreviewDisplay(mHolder);

mCamera.startPreview();

startFaceDetection(); // re-start face detection feature

} catch (Exception e){

// ignore: tried to stop a non-existent preview

Log.d(TAG, "Error starting camera preview: " + e.getMessage());

}

}

注意:在调用startPreview()方法之后,要记住调用这个方法。不要试图在你的Camera应用程序的主Activity的onCreate()方法中启动面部识别方法。在你的应用程序的这个执行时点,预览还不是有效的。

延时摄影

延时摄影允许用户把几张图片合成一个几秒或几分钟的视频剪辑。这个功能要使用MediaRecorder对象来记录图像的延时序列。

要用MediaRecorder对象来记录延时视频,要想录制普通视频一样,必须要配置的记录器对象,如把每秒采集的帧数设置到较小的数字,并且要使用一个延时品质设置,如下代码所示:

// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)

mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_HIGH));

...

// Step 5.5: Set the video capture rate to a low number

mMediaRecorder.setCaptureRate(0.1); // capture a frame every 10 seconds

这些设置是要对MediaRecorder对象所要做的必要设置的一大部分。对于完全的配置代码示例,请看前文的“配置MediaRecorder”。一旦配置完成,你就可以把它当做普通的视频剪辑来录制视频了。关于配置和运行MediaRecorder对象的更多信息,请看前文的“采集视频”

使用Camera功能 AREA的理解的更多相关文章

  1. 【转】Android Camera(五)使用Camera功能 AREA的理解

    http://blog.csdn.net/think_soft/article/details/7998478 使用Camera功能 大多数的Camera功能都是使用Camera.Parameters ...

  2. Luat Demo | 一文读懂,如何使用Cat.1开发板实现Camera功能

    让万物互联更简单,合宙通信高效便捷的二次开发方式Luat,为广大客户提供了丰富实用的Luat Demo示例,便于项目开发灵活应用. 本期采用合宙全新推出的VSCode插件LuatIDE,为大家演示如何 ...

  3. maximo功能修改(初步理解)

    已接触IBM公司的MAXIMO近三个月,在这时间里自己对maximo也有所了解,今天将自己总结写在这里,方便自己的温习和大家的参考,不足之处还望指出,我一定在第一时间内修改. 今天在公司所做的就是完善 ...

  4. 利用eclipse中的各种功能帮助你理解代码

    @菜单栏下面,工具栏,有一对黄色的箭头按钮,一个指向左边,一个指向右边,快捷键是Alt+Left/Alt+Right 功能是跳转到你刚刚编辑过的地方 这里的Left/Right指的是左右方向键,可以方 ...

  5. sqlserver2012的审计功能的相关理解

    1.sqlserver2012可以做实例的审计,以及数据库的审计,基本包括了所有的操作.可以符合我们的要求.   2.审计功能需要实例级别的配置数据库级别的配置,实例上建立“审核”,数据库上建立“数据 ...

  6. java 手动实现远程执行功能(深入理解java虚拟机)

     1.功能类 功能类共有五,分别是: package org.jvm; import java.io.*; /** * 对字节数组操作的工具类 */ public class ByteUtils { ...

  7. Android简单调用相机Camera功能,实现打开照相功能

    在最開始接触Android相机功能之前,先来体验一下Android调用系统照相功能吧 核心代码 Intent intent = new Intent(); //调用照相机 intent.setActi ...

  8. 【温故而知新-Javascript】理解 DOM

    DOM(Document Object Model,文档对象模型)允许我们用 JavaScript 来探查和操作 HTML 文档里的内容.它对于创建丰富性内容而言是必不可少的一组功能. 1. 理解文档 ...

  9. Android 的Camera架构介绍

    http://java-admin.iteye.com/blog/452464   第一部分 Camera概述Android的Camera包含取景器(viewfinder)和拍摄照片的功能.目前And ...

随机推荐

  1. BleedTree动画混合树[Unity]

    Unity在中土大陆的大肆推广能从广泛的中文翻译资料中看出.所以,手册才是王道. 游戏动画中的一个常见任务是在两个或更多相似运动之间混合.最佳的已知示例可能是根据角色速度混合行走和奔跑动画.另一个示例 ...

  2. 使用Maven对JAVA程序打包-带主类、带依赖【转】

    很多时候,我们需要对编写的程序进行打包,这个时候,我们可以借助一些项目构建工具,如maven, sbt, ant等,这里我使用的是maven. 打包成可执行有主类的jar包(jar包中无依赖) 以下是 ...

  3. SQLite - Java

    安装 在 Java 程序中使用 SQLite 之前,我们需要确保机器上已经有 SQLite JDBC Driver 驱动程序和 Java.可以查看 Java 教程了解如何在计算机上安装 Java.现在 ...

  4. hive入门

    hive 当前用到的就这些,以后用到的再补充. 参考自官方文档 大小写不敏感 创建/删除数据库 CREATE/DROP DATABASE|SCHEMA [IF NOT EXISTS] <data ...

  5. 一句命令激活windows/office

    激活windows 服务器地址:kms.03k.org (点击检测KMS服务器是否正常) 更新: 脚本维护更新:2016-11-02 服务端版本:2017-06-17 (1111) 有疑问可以戳QQ群 ...

  6. SQL Server 商业智能

    原帖:http://bbs.51cto.com/thread-1089708-1.html 商业智能概述一.数据仓库与分析服务(SSAS)二.集成服务(SSIS)三.报表服务(SSRS)以下是SQL ...

  7. java 多线程 33: 多线程组件之 Callable、Future和FutureTask

    Callable Callable和rRunnable差不多,两者都是为那些其实例可能被另一个线程执行的类而设计的,最主要的差别在于Runnable不会返回线程运算结果,Callable可以(假如线程 ...

  8. WebSocket的Cookie问题(转)

    问题:我用Nginx作静态服务器,Node.js监听另外端口作WebSocket服务器,客户端创建实例时,如果origin和host不一样的话,req实例的headers中没有cookie… ###解 ...

  9. ArrayList, Vector和CopyOnWriteArrayList对比学习

    ArrayList线程不安全的例子 线程安全就是多线程访问时,采用加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据 ...

  10. <黑天鹅>读书笔记

    书在这里 不要关注可能性,而要关注结果 不要迷信那些估值和行业发展研究文字,因为所有大家看得到的模型和研究报告都是有关白天鹅的,而你的命运或许实际掌握在黑天鹅那里 你不知道的事比你知道的事有意义 你可 ...