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

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对象的更多信息,请看前文的“采集视频”。

时间: 2024-10-05 05:19:58

【转】Android Camera(五)使用Camera功能 AREA的理解的相关文章

使用Camera功能 AREA的理解

转至 http://blog.csdn.net/think_soft/article/details/7998478 使用Camera功能 大多数的Camera功能都是使用Camera.Parameters对象来激活和控制的.首先要通过Camera对象实例的getParameters()方法,来获取这个对象,然后把修改后的参数对象再设置给Camera对象,以下示例代码演示了这个操作: // get Camera parameters Camera.Parameters params = mCam

Android 实例讲解自定义Camera拍照和预览以及前后置摄像头切换

上一篇博文讲解了怎么去调用本地图片和调用系统拍照图片(http://blog.csdn.net/a123demi/article/details/40003695)的功能. 而本博文将通过实例实现自定义Camera的功效.具体功能如下: 1.实现自定义Camera拍照: 2.实现前后置摄像头的切换: 3.实现Camera拍照后图片缩小显示以及正常预览: 4.实现Camera拍照后图片保存: 在具体实现代码之前,我们先来了解一下Android api对实现自定义Camera的介绍. 根据api的介

Android源码笔记&mdash;&mdash;Camera系统架构

Camera的架构与Android系统的整体架构保持一致,如下图所示,本文主要从以下四个方面对其进行说明. Framework:Camera.java Android Runtime:android_hardware_Camera.cpp Library:Camera Client和Camera Service HAL:CameraHardwareInterface 一.Framework:Camera.java Camera是应用层软件直接使用的类,涵盖了启动.预览.拍摄及关闭等操作摄像头的全

Android开发之初识Camera图像采集

/* * Android开发之初识camera图像采集 * 北京Android俱乐部群:167839253 * Created on: 2011-8-24 * Author: blueeagle * Email: [email protected] */ 下面记录一个简单的相机的制作方法. 制作相机,首先需要添加照相的权限.添加方法是在AndroidManifest.xml文件中添加 <uses-permission android:name=” android.permission.CAMER

android camera(一):camera模组CMM介绍【转】

转自:http://blog.csdn.net/xubin341719/article/details/7723725 版权声明:本文为博主原创文章,未经博主允许不得转载. 关键词:android  camera CMM 模组 camera参数 平台信息: 内核:linux 系统:android 平台:S5PV310(samsung exynos 4210)  作者:xubin341719(欢迎转载,请注明作者) 下载:常用摄像头规格书(个别有android驱动程序)  :bf3703 30W.

Android已有的原生Camera框架中添加自己的API的实现方案。

在过去的2个月里,基本定制并评估完了项目所需要的基本需求,围绕着全志A31和Android4.2.2来实现.最近由于需要,在修改他的Camera的架构中,需要应用程序给HAL透传一个参数来控制底层图像处理算法的实现,即需要提供一个合理的API供APP的开发使用. 起初想到的,最简单有效的方法就是重新定制SDK,但不断遇到的问题,使得最终切换了部分的思路,但核心没有发生变化. Android系统的架构层次分明,在复杂的架构中往往理解以后会变得十分的简单,现在看来,过去2个多月的时间基本把Camer

Error:(12, 24) 警告: [deprecation] android.hardware中的Camera已过时.android

问题:android studio编译项目时出现: Error:(12, 24) 警告: [deprecation] android.hardware中的Camera已过时 解决:(只是让其不提示) 1.app的 build.gradle中 1 android { 2 ... 3 lintOptions { 4 checkReleaseBuilds false 5 abortOnError false 6 7 } 8 } 2.根目录的build.gradle中 allprojects { ...

Android拍照丶录制视频功能实现

基本实现了拍照,录制视频,前后摄像头切换的功能,可以转屏,聚焦 源码:https://gitee.com/lyc96/android_video 1.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app

Android解决WebView的定位功能、视频全屏播放、下载功能、页面Url的处理、进度条处理

解决WebView的定位功能.视频全屏播放.下载功能.页面Url的处理.进度条处理 事先说明: 定位功能在安卓6.0需要用户手动确认权限后才能使用 若需在安卓6.0适配WebView的定位功能,则需要在WebView中手动增加用户权限访问 详细可百度安卓6.0权限管理系统,或者采用第三方封装好的权限管理类进行编写(如Bmob) 如果对内容不理解的话,可参考最后的整个类的代码 如果对BaseActivity这个抽象类不理解的话,可以查看下面一篇文章对BaseActivity的介绍 步骤一:webv