转至 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. vs ComboBox显示多行

    ComboBox,Drop List Type添加了多个数据,但是编译出来点下来按钮,只有一行. 惆怅 然后搜了下发现有人说: 在资源里面点向下箭头,把数据区拉长一点 然后才发现,原来资源里的Comb ...

  2. 【ARM】串行通信

    异步通信 所谓异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本是同步的.   异步串行通信的特点可以概括如下 1)以字符为单位传送信息 2)相邻两字符间的间隔是 ...

  3. LeetCode: Search Insert Position 解题报告

    Search Insert Position Given a sorted array and a target value, return the index if the target is fo ...

  4. webscan v0.01

    ps:本人不是写代码的料.写出来的贼垃圾.大牛看了如果有可以优化的提出来哈. #by def import urllib res = {} website = raw_input() if " ...

  5. java基础解疑!!!

    疑问一:0.01+0.09的结果? public class MathTest{ public static void main(String[]args){ double a = 0.01, b = ...

  6. 【转】ExtJS获取父子、兄弟容器元素方法

    原文地址:http://www.cnblogs.com/linxiong945/p/3961732.html 1.当前对象的父对象(上级对象) this.ownerCt: 2.当前对象的下一个相邻的对 ...

  7. 地铁盾构管片姿态测量软件(Excel)

    记得11年刚开始从事盾构测量的时候,只知道搬站(倒站),测导线,还有就是测量管片.觉得最麻烦的就是在每个管片上面放个水平长尺,用全站仪测出他的水平位置和高程,但当时是本子记录每个数据,回去在敲到电脑上 ...

  8. StreamingContext.getOrCreate

    /** */ object AppRealTime { def main(args: Array[String]): Unit = { ) { println("please input a ...

  9. face alignment---各种算法框架

    [深度学习]最新的一些开源face alignment及评价 转载  2017年01月12日 11:33:39 2047 dlib :https://github.com/davisking/dlib ...

  10. Git 生命周期

    在本章中,我们将讨论的Git的生命周期.在后面的章节中,我们将看到的Git命令为每个操作. 一般工作流程是这样的: 克隆Git仓库作为工作副本. 可以添加/编辑文件,修改工作副本. 如果有必要,你还服 ...