Qualcomm Camera基础

1. 设置摄像头方向

2. 打开线程与预览线程 

3. 设置参数

4. Camera外设按键

5. 自动对焦与触摸对焦

6. 拍照

7. 人脸检测

8. 位置管理

9. 旋转管理

10. 变焦

11. 录像

Camera的架构为典型的C/S架构,Client端,用户的行为,是为应用程序进程,Server端,设备的功能,是为Camera服务守护进程,客户端进程承载用户的需求,由Binder进程间通信送往服务端实现设备的功能,服务端由回调函数和消息机制反馈数据返还给用户。

ps查看进程,类似 com.android.camera是为客户端Camera进程,/system/bin/mediaserver是为服务端守护进程,由系统启动时开启。

1. 设置摄像头方向

Framework框架层的Camera对象(camera.java)里有一个类class CameraInfo,里面存放了两个公有成员变量facing和orientation,即我们要讨论的前后置和方向。 程序第一次初始化时initializeFirstTime(),通过getCameraInfo()得到前后置和方向的信息,客户端发送请求getCameraInfo()询问服务端,服务端调用抽象层拿数据,抽象层参考底层camera sensor驱动的数据facing和orientation,这两个值在驱动里是写死的,不能由用户改变,camera程序启动以后就把它们作为全局变量存放起来。

1.1 前置与后置

后置back camera背对手机屏幕,朝外,像素高,前置front camera,面对自己,朝内,像素低。

1.2 方向

摄像头模组有长边和短边,比如采集图像的比例为4:3,那么4为长边,3为短边。设备屏幕也有长边和短边,理论上,摄像头模组的长边不能与屏幕的长边垂直,至于为什么呢,我语文水平太差,没办法很好地表达出来...总之目的就是为了显示效果。

2 打开线程与预览线程

onCreate()里会先后开启CameraOpenThread和CameraPreviewThread。

打开camera还需要线程?CameraOpenThread名为打开,实为C/S connect连接服务端,binder进程间通信,开销较大。预览线程必须在打开线程完成以后执行,它贯穿始终直到进程消亡为止,整个预览过程相对复杂,在抽象层和底层驱动实现,概括讲,预览线程再开启两个线程,一个拿sensor的frame,一个送往framebuffer经surfaceflinger显示出来。

3 设置参数

预览拍照录像之前,用户需要设置很多参数,比如闪光,白平衡,场景,对比度等。

程序里这些参数保存在SharedPreferences共享优选项和Parameters两个地方,Preferences包含Parameters,打开程序读取优选项参数,关闭程序保存优选项参数,考虑到用户经常会调整参数,引入Parameters来保存从打开以后到关闭以前这个中间过程的参数变量,Parameters的键值由抽象层根据硬件sensor的能力决定。

4. Camera外设按键

Manifest里注册broadcast receiver,

        <receiver android:name="com.android.camera.CameraButtonIntentReceiver">
            <intent-filter>
                <action android:name="android.intent.action.CAMERA_BUTTON"/>
            </intent-filter>
        </receiver>

有些手机上有camera按键,用户按下按键,android输入系统有两种实现方法,

1)发送广播CAMERA_BUTTON,收到广播后开启主Activity。

2)上报键值KEYCODE_CAMERA,程序收到消息,可自定义实现功能,比如拍照。

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_CAMERA:
                if (mFirstTimeInitialized && event.getRepeatCount() == 0) {
                    onShutterButtonClick();
                }
                return true;

5. 自动对焦与触摸对焦

外界事物由光线经凸透镜聚焦到sensor上成像,camera模组开启马达前后平移镜头取得最佳成像效果,这个过程称之为对焦。

5.1 自动对焦

1) camera模组会因感光强度变化而自动开启对焦,驱动控制。

2) 用户长按快门,软件控制自动对焦。

3) 用户按下快门拍照,拍摄前自动对焦。

程序里,Camera对象实现类ShutterButton的接口OnShutterButtonListener里的方法onShutterButtonFocus(boolean pressed)和onShutterButtonClick(),后者是拍照,下节讨论,先看onShutterButtonFocus(boolean pressed),这个pressed判断是否为一次有效的长按,如果是的话,执行autoFocus(),这个autoFocus()也是Camera对象实现类FocusManager的接口Listener里的方法,由binder交给camera
service,最后在底层驱动实现自动对焦。

5.2 触摸对焦

自动对焦的对焦区域位于屏幕正中,用户也可触摸特定区域对焦。

Camera对象实现类View的接口OnTouchListener里的方法onTouch(),输入系统上报MotionEvent的xy坐标,保存在Parameters,执行autoFocus(),抽象层读取Paramters的触摸点坐标,实现区域对焦。

6. 拍照

拍照分四步,对焦,拍照,接收图片,保存图片。

mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback,
                mPostViewPictureCallback, new JpegPictureCallback(loc));

需要理解四个回调函数,参考上一篇文章。

1)对焦

拍照前如果已经区域对焦,则取消自动对焦,反之,开启一次自动对焦。对焦完成后,底层发送对焦成功与否的消息给camera对象,FocusManager把状态mState保存起来,如果正在对焦未完成(mState == STATE_FOCUSING)则不可拍照,直到对焦完毕。

2)拍照

onShutterButtonClick() -> doSnap() -> capture() -> takePicture(),具体实现在抽象层和底层驱动,实质就是拿一张预览的图像,抽象层读取拍照时的Parameters参数配置,包括用户选择的照片大小。

3)接收图片

通过回调,由底层发送图片给camera对象。

RawPictureCallback,得到原始图片,需要软件压缩Jpeg。(YUV转Jpeg)

JpegPictureCallback,直接得到Jpeg图片,需要硬件压缩Jpeg。

PostViewPictureCallback,拍完后预览图片。

4)保存图片

交由线程ImageSaver保存图片和生成thumbnails。

默认路径位于/mnt/sdcard/DCIM/Camera/

7. 人脸检测

人脸检测可以软件实现,可以硬件实现,软件实现增加CPU开销,硬件实现增大耗电,鼓励硬件实现...

上层Camera对象实现了 framework层Camera的接口FaceDetectionListener的方法onFaceDetection(Face[] faces, Camera camera),回调机制同上,硬件sensor识别脸部信息,发送face给camera对象,framework定义face的特征,比如眼睛,嘴巴,上层保存mFaces数据,更新UI。

8. 位置管理

位置管理LocationManager用来记录拍摄图片的GPS位置信息(经维度),存入JPEG头部插入的Exif里。

用户在菜单“相机设置”里的"保存所在位置"选择打开(前提是GPS已开启),屏幕左上方会出现一个GPS图标,表示现在可以记录GPS信息了。

程序里,Camera对象实现了位置管理监听器LocationManager.Listener的接口showGpsOnScreenIndicator()和hideGpsOnScreenIndicator(),显示或者隐藏GPS图标。

程序第一次初始化时initializeFirstTime(),通过读取优选项Preference得到bool值recordLocation,判断是否需要记录GPS信息,如果需要,在拍照capture()里调用LocationManager的方法得到Location loc,并将其存入Exif。

9. 旋转管理

假设一台手机,camera正常安装,竖直方向作为默认方向(orientation == 0)拍摄照片,即拍摄“肖像照”(portrait),得到的照片显示在屏幕上也是竖直方向。

如果把手机旋转90度水平过来拍摄“山水照”(landscape),对于camera sensor来说,没有旋转的概念,所以软件上要把图片旋转90度回来。

软件上,需要借助方向监听器随时更新方向信息,并保存在Parameters里,抽象层实现拍照功能时从Parameters里读取方向。

具体的,camera对象内部类MyOrientationEventListener的方法onOrientationChanged()保存方向orientation的值,MyOrientationEventListener继承OrientationEventListener,OrientationEventListener的onSensorChanged()把从sensorManager拿到的xyz坐标转换成方向。

程序启动,注册sensor监听器并使能,sensorManager不断上报底层sensor数据,通过消息机制发送到camera对象,后者计算坐标数据得到方向orientation的值(实际外包给orientationListener完成),最后保存Parameters。

10. 变焦

用户拖动Zoom横条可放大缩小预览画面连续变焦,另一种所谓状态变焦,其原理是一样的。

camera对象的内部类ZoomChangeListener实现ZoomControl的方法,实质是把变焦的任务全权交给ZoomControl。ZoomControl监听处理用户的触摸事件dispatchTouchEvent(),用来得到并处理变焦倍数mListener.onZoomValueChanged(index),它由mCameraDevice.startSmoothZoom()通过 binder交给camera service,camera service再通过sendComand命令机制交给抽象层实现变焦,抽象层开启变焦线程,变焦改变预览,通过回调机制发送消息CAMERA_MSG_ZOOM把变焦倍数返还给camera对象,最终camera对象收到消息后,ZoomListener.onZoomChange()把变焦倍数保存到Parameters.

11. 录像

ModePicker负责切换模式,一共有三种模式,普通模式,录像模式和全景模式,Manifest里依次声明这三个activity。

切换模式,销毁原有activity,开启新activity,伴随关闭preview,重启preview,保存配置,读取配置,开销很大。

录像VideoCamera.java同预览Camera.java的思路类似,按下录像按钮,程序监听用户事件,开启录像,录像交给MediaRecoder,StagefrightRecorder负责。

 本文转载于http://blog.csdn.net/qq69696698/article/details/7399518

时间: 2024-09-13 22:09:02

Qualcomm Camera基础的相关文章

绿盟科技网络安全威胁周报2017.12 关注fastjson远程代码执行漏洞 漏洞细节以及利用工具已经曝光

绿盟科技发布了本周安全通告,周报编号NSFOCUS-17-12,绿盟科技漏洞库本周新增44条,其中高危12条.本次周报建议大家关注 fastjson远程代码执行 .目前漏洞细节已经披露,可导致大规模对此漏洞的利用.强烈建议用户检查自己使用的fastjson是否为受影响的版本,如果是,请尽快升级. 焦点漏洞 fastjson远程代码执行 NSFOCUS ID 无 CVE ID 无 受影响版本 1.2.24及之前版本 漏洞点评 fastjson在反序列化时存在安全漏洞,攻击者可以通过提交一个精心构造

绿盟科技网络安全威胁周报2017.18 ​WordPress 远程代码执行/非授权重置密码漏洞CVE-2017-8295

绿盟科技发布了本周安全通告,周报编号NSFOCUS-17-18,绿盟科技漏洞库本周新增36条,其中高危5条.本次周报建议大家关注 WordPress 远程代码执行/非授权重置密码漏洞 . CVE-2016-10033是之前phpmailer在不同场景下的新利用,漏洞可使未经身份验证的远程攻击者在Web服务器用户上下文中执行任意代码,远程控制目标web应用.CVE-2017-8295存在于WordPress 4.7.4之前版本,远程攻击者通过构造密码重置请求,并伪造Host HTTP标识头,可以获

J2ME程序开发全方位基础讲解汇总

程序     一.J2ME中需要的Java基础知识 现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成了一些不必要的麻烦,下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明. J2ME中使用到的Java基础知识:   1.Java语法基础:包括基本数据类型.关键字.运算符等等   2.面向对象的思想:类和对象的概念,继承和多态等等.   3.异常处理   4.多线程 J2ME

PS基础:编辑色调和色彩

  不管什么时候,每张彩色照片中都潜藏着巨大的编辑潜力.一般情况下,你很有可能只开发出了其中很少的一部分,而很少能真正挖掘出它所有的潜力.为什么呢?如果你已经使用照片处理软件中的一个或者多个色彩调节器做过编辑操作了,你就会明白,在色彩处理领域一切皆有可能.当然,你所喜欢的处理效果也得有条件做出才行.如果你不仅对自己的照片进行后期处理,还为别人做这项工作,那么你就不应该把图像的色彩只留给运气. 真假色彩 从根本上来说,调整图像的色彩有两个目的:一是获得可信的.自然的色彩,二是富有创意地使颜色"奇异

如何在两小时内搞懂PHOTOSHOP基础工具?

  初学者面对Photoshop这个庞然大物,第一直观感受是不知道从何下手.那么多工具,学完这个忘那个,有木有什么教程可以一次性学完呢?今天这篇好文,只要童鞋们打起精神来,两个小时就可以搞懂基础的工具使用!绝对是新手速成Photoshop的一个好机会!赶紧来学习! 教程很有意思,从A--Z 依次讲解每个工具的使用,精辟彻底,不拖泥带水呦. 3D面板:作为Adobe Photoshop Extended的一部分,你可以在Adobe Photoshop CC中找到它.3D面板中展示了所有3D文件中允

【J2ME3D系列学习文章之一】J2ME3D开发技术和基础知识

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/j2me-kjava/249.html         由于J2me 3D(jsr184)的文章网上也有了不少,这里就不多说了,只是概括的说下针对于j2me 3D开发基本需要了解的知识以及简单阐述几个术语;  第一:开发模式  :         J2me 3D(jsr184)api 分为两种开发模式,一个是立即模式,另一个就是保留模式.这里简

Qualcomm基于一款面向移动终端的5G调制解调器芯片组 实现全球首个正式发布的5G数据连接

2017年10月17日,中国香港 --Qualcomm Incorporated(NASDAQ: QCOM)今日宣布其子公司Qualcomm Technologies Inc. 成功基于一款面向移动终端的5G调制解调器芯片组实现5G数据连接.Qualcomm骁龙 X50 5G调制解调器芯片组实现了千兆级速率以及在28GHz毫米波频段上的数据连接,推动全新一代蜂窝技术向前发展,同时加快为消费者提供支持5G新空口的移动终端.此外,Qualcomm Technologies还预展了其首款5G智能手机参

转载:android camera 3d

版本:1.0日期:2014.4.14版权: 2014 kince 转载注明出处 一.概念 在Android中要想实现3D效果,第一个想到的应该就是OpenGL ES,因为在很多基础教材中几乎都提到了它.但是其使用起来还是稍微麻烦一些,而且它也主要用在游戏方面,那在应用方面有没有更好的选择呢?答案是肯定的,使用Camera类就可以完成3D效果.它有旋转.平移的一系列方法,实际上都是在改变一个Matrix对象,一系列操作完毕之后,我们得到这个Matrix,然后画我们的物体,就可以了.实际上内部机制还

Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅

原文:Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Android开发环境,上三期分别养成高富帅.轻松邂逅女神.并和女神约会成功,那么从本期开始准备出发甜蜜之旅. Android程序必须运行在Android系统,因此Android开发时必须准备相关的运行环境,即Android虚拟设备(Android模拟器).   一.AVD Manager入口    进入ADT Bu