Android Camera使用

原创 2016年06月02日 23:23:36

转载请标明出处:
http://blog.csdn.net/zq2114522/article/details/51542071
本文出自:【梁大盛的博客】

Androd Camera使用

引:摄像头的使用大家应该个个都是行家,但是作为一个开发者的角度出发.摄像头又展现给我们什么呢?

理解Camera旋转的正确姿势

  • 90度来来源

很多开发者第一次接触摄像头的时候应该都是发现一个很严峻的问题-通过surfaceView预览摄像头的成像的时候上下,左右都颠倒了.
具体看看其实就好像摄像头的位置给旋转了90度.

这是神马回事?要理解这一个问题,我们首先从屏幕的角度出发.

  • 屏幕取景
    例如,现在是身处大海边.你所看到到风景一个是这样.是吧,没错吧.这时候掏出手机拍照完全是一件很符合逻辑的事情.

这里写图片描述

这个时候你掏出手机拍一张,应该是这样的姿势.你手机预览框应该看到的是这样.

这里写图片描述

事实上如果你不做特殊的处理应该是这样.
这里写图片描述

  • 摄像头和你想象中的不一样

导致这个问题的根源在于摄像头和你想象中的完全不一样.摄像头是x轴比y轴要大.这是什么意思?细细想想,以前用数码相机拍出来的相片不都是水平的么?所以你可以百度上网摄像头的规格,基本都是1980*1080,1600*1200,1400*10501280*1024等等.(具体自行百度)

这里写图片描述

首先我们手机默认情况下是竖屏(宽小高大),然而摄像头是横屏(宽大高小).这个怎么办?其实也不就是屏幕和摄像头形成90度夹角而已嘛!所以一般处理手段都是把摄像头旋转90度安装在手机背面.所以90度是源于此!(数码相机一般都是横屏所以不存在这个问题.)

这里写图片描述

嘿嘿,好像问题都解决了吧?too yang too simaple!
事实上为什么还会出现上下,左右颠倒呢?这就要说另一样东西了!现在每一个厂家在设计手机的时候都会把摄像头旋转90度安装,但是摄像头君它并不知道啊!并不知道!并不知道!

所以,当摄像头被旋转90度以后效果是这样的!
因为我旋转以后也得把原点放在左上角啊!然后什么情况出现呢?当预览的时候活生生把一个横屏输出的图像展示在一个竖屏的屏幕中,所以才会出现上下,左右颠倒了.

其实这个问题很简单就能处理了.调用setDisplayOrientation函数在预览的时候旋转一个角度.
这就是理解Camera旋转的正确姿势!

识别,拍照

什么是识别?什么是拍照?
对于Android来说,摄像头有很多回调函数.
我们也可以根据需要添加回调函数.对焦成功的时候,有最新一帧预览图片的时候,成功拍照之前的时候,成功拍照并且设备回返未处理的原始数据的时候,成功拍照并且设备返回压缩后的图片的时候……太多太多了!

一般来说关注两个回调函数即可!

  • 有最新一帧预览图片的时候(简称,T1)
  • 成功拍照并且设备返回压缩后的图片的时候(简称,T2)

这两个时间点是很重要,并且大有文章可以做.首先说说第二种情况

T2很明显是设备能删除图像数据的时间点,我们一般只需把数据流持久化即可.应该保存在内存卡的保存在内存卡,应该保存在内在Flash的就保存在Flash.因地制宜.

T1就比较特殊,当我们把摄像头预览打开的以后.摄像头每时每刻都会把图像输出到我们的预览框中(Android 使用SurfaceView实现预览框).事实上我们不可能对没一刻的图像都进行业务的处理.
最常用的办法是调用setPreviewCallback 函数设置一个PreviewCallback回调函数.在设置PreviewCallback回调函数以后,当有一帧最新的预览图片的时候删除的时候调用onPreviewFrame函数.我们在onPreviewFrame可以获取此桢图像进行人脸识别,笑脸检测等等高等数学的事情.注意到这个时间点了么?

在onPreviewFrame处理大量的数据是需要时间的!这处理的这一段时间摄像头还是有数据源源不断的输出到SurfaceView.但是我们都忽略掉.在onPreviewFrame处理完一帧数据以后,改标识出人脸的标识出来.当然在onPreviewFrame处理完高等数学的操作以后,必定会在重新设置setPreviewCallback添加一个PreviewCallback回调函数以便进入下一轮的处理.当计算速度很快的时候这一连串的在流上一点一点的操作就会练成一线!事实上也如此.

所以我们可以理解很多在预览时候进行处理的基本上都是通过setPreviewCallback函数和PreviewCallback完成的.

注意:
setDisplayOrientation 会令预览的图像旋转,但是不会影响onPreviewFrame获取到的图片!

这里写图片描述

附上一个简单的demo(能控制闪光灯,对焦模式,预览图片大小,拍照图片大小.图片保存路径-\手机存储\CapturePicture):
https://github.com/dsliang/CameraDemo

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

Android Camera使用总结与那些坑

写在开头需求方:上传试卷的时候,用户自己拍的照片有很多问题。如:不清晰、图片歪了、错误图片等。我们要是能够对拍摄照片进行识别处理就好了,能够裁切矫正就更好了,最好可以像二维码扫描一样,直接识别处理~ ...

Android Camera 使用一例,视频聊天app

视频聊天的应用可以从下面的框图示意。     所以需要从camera获取视频数据(YUV420sp),压缩成H264/MPEG4/H263的包,再传递到对方。接收对方的压缩包,解压出来显示到LCD...
  • brooknew
  • brooknew
  • 2012年09月20日 11:31
  • 14222

Android Camera的使用 (三)

一、创建一个Camear App二、创建拍照功能 创建一拍照我们分以下几步: 1、检测和访问相机—–检测相机是否存在 2、创建一个用来预览的对象——创建一个 类继承自SurfaceView 并实...

Android Camera使用小结

Android关于Camera的使用,一是capture image,二是video。 由于android提供了强大的组件功能,因此对camera的开发,可以使用两种方法: (1)借助Intent...
  • boywgw
  • boywgw
  • 2012年08月30日 08:56
  • 444

android Camera 如何判断当前使用的摄像头是前置还是后置

转载自:http://blog.csdn.net/fulinwsuafcie/article/details/8862836 现在 Android 平台的智能手机一般都标配有两颗摄像...

Android Camera的使用 (二)

一、前言 在我们使用Camera时我们应该首先考虑以下几个注意事项 1、我们的设备必须要有摄像头,以及我们应该在AndroidManifest.xml中将需要用到的权限必须加上。 2、我们的应用...

android Camera 如何判断当前使用的摄像头是前置还是后置

现在 android 平台的智能手机一般都标配有两颗摄像头。在 Camera 中都存在摄像头切换的功能。 并且有一些功能前后置摄像头上会有所不同。譬如人脸检测,人脸识别,自动对焦,闪光灯等功能, ...

Android Camera API 2使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜)

本系列教程会有三篇文章讲解Android平台滤镜的实现方式,希望在阅读本文之前先阅读前面两篇文档。...

Android Camera的预览回调接口PreviewCallback使用

首先定义一个类实现Camera.PreviewCallback接口,然后在它的onPreviewFrame(byte[] data, Camera camera)方法中即可接收到每一帧的预览数据,也就...

Android Camera使用小结

Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Inten...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Camera使用
举报原因:
原因补充:

(最多只允许输入30个字)