camera的构成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了camera的构成相关的知识,希望对你有一定的参考价值。

参考技术A

拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进行处理,最终转换成手机屏幕上能够看到的图像。
数字信号DSP主要通过一系列复杂的数学运算,对数字信号参数进行优化处理,并处理后的信号通过USB等接口传到PC设备。
常见的摄像头类型主要是CCD和CMOS传感器
RGB格式:16bit数据格式5bit R+6bit G+5bit B。G多一位,是人眼对绿色比较敏感。
YUV格式:Y+UV格式,YUV是指亮度参量和色度参量分开表示的像素格式,这样分开利于指定像素的颜色。
DATA格式:CCD或者CMOS在将光信号转换为电信号时的电平高低的原始记录,单纯的将没有进行任何处理图像数据,即摄像元件直接得到的电信号进行数字化处理而得到。

ALC:自动亮度控制
ABLC:自动暗电流校正
AWB:自动白平衡控制
gain,exposure 增益、曝光
frame rate and size 帧速率和大小
image mirror 图像镜像
image flip 图像翻转
image panning 图像平移
image cropping 图像裁剪
column and row sub-sampling 偶然binning行和列的二次抽样和并合
image downsizing scalar图像缩小标量

preview :一直输出数据,不保存
capture :抓拍一帧数据储存
FF:固定焦距fixed focus
AF:自动对焦 auto focus
AF的流程:
1 preview 及手机从摄像头取数据刷到LCD上面
2、执行af enable 然后af trigger 等待AF完成判断AF完成。其标志是执行完AF trigger
3、手机停止向LCD刷preview数据
4、切换摄像头进入capture模式
5、抓一帧数据完成capture
6、关闭AF Enable

VGA是计算机一种通用的接口标准,VGA是IBM推出的一种视频传输标准,具有分辨率高,显示速率快。颜色丰富等优点,在彩色显示器领域得到广泛的应用。
raw bayer :
bayer 格式是相机内部的原始图片,一般后缀名为.raw。

相机功耗 = 相机场景测得总功耗 - 静态亮屏功耗

RAW图像就是CMOS或者CCD图像感应将捕捉到的光源信号转化为数字信号的原始数据,RAW文件是一种记录了数码相机传感器的原始信息。同时记录了由相机拍摄所产生的一些元数据的文件。

是指的是图像中杂点的干扰,表现为图像中有固定的色彩杂点。

摄像机对白色物体的还原,相关概念:色温

与人的眼睛成像是想成原理,简单说就是成像范围。

自动对焦可以分为两大类:一类是基于镜头与被拍摄目标之间距离测量的测距自动对焦,另一类是基于对焦屏上成像侵袭的聚焦检测自动对焦。
(变焦是把远处的物体拉近,对焦是让图像清晰)

就是光圈和快门的组合,光圈,快门速度,ISO、gamma即人眼对亮度的响应曲线。

两者都是利用感光二极管来进行光电转换的技术,CCD表面接收到因快门开启,而从镜头进来的光线照射时,即会将光线的能量转化成电荷,这些电荷传输至放大解码元件,使之能还原所有CCD上感光元件产生的信号,并构成了一幅完整的画面。
CMOS影像感测器的影像采集方式,感光二极管所产生的电荷会直接有电晶体放大输出。

CMOS图像传感器本质是一块芯片,主要包括:感光区阵列、时序控制、模拟信号处理以及模数转换等模块,各模块分别为:像素阵列(完成光电转换,将光子转换为电子)、时序控制(控制电信号的独处、传递)、ADC(信号的去噪)
像素阵列占整个芯片的面积最大,像素阵列是由一个个像素组成,他对应到我们看到每一张图片中的每个像素,每个像素包括感光区和读出电路,每个像素的信号经由模拟信号处理后,在经过ADC模数转换后即可输出数字处理模块。

由于mclk在sensor上电之前就已经开了,如果不满足sensor spec中上电时序要求,可在开sensor power之间将mclk先关闭,然后再需要时再打开。控制mclk可以调用

2.摄像头只编译一个库命令

3.关掉TSF
在vendor下的camera_tuning_para_ov13850mipiraw.cpp文件里光标所在处,改为0即可
4.摄像头颜色颠倒:

5.如果摄像头同ID可以再kernel下的驱动文件里加上这个

6.相机开启闪光灯在明亮的地方也会闪:camera_AE文件修改u4Strobe值20为0。
7.关于sensor预览时有条纹问题分析:
1.电源不稳定,COMS sensor 对电源的稳定要求比较高。
2.同步信号的干扰,彩色条纹显然是每行数据有信号丢失造成的。
3.检查mclk和pclk以及他们的ratio,软件设置是否相符
4.随机条纹的干扰,查电源
5,行场同步随机干扰,一般不大会出现,除非HSYNC与VSYNC中间窜入电阻或者走线过长。

通过调节相机预置的白平衡设置,来与当前实际的光线条件想匹配。只要保证白色的物体在画面中呈现出准确的、没有偏色的白。那么画面中所有的其他颜色就也会得到准确的还原。

通常在不能加大光圈、降低快门速度的情况下,常常用提高ISO来获得足够的曝光量。但随着ISO的提高,照片上会产生“噪点”也随之增加,照片上看去,有许多“麻点”,所以在光线较好,或者没有设置的限制时,应该尽量用低ISO进行拍摄。这样,照片看上去会干净、清晰得多、只有在光线很差,有无法增大光圈或降低快门速度来满足曝光量,才使用提升ISO的办法。

锐度也叫清晰度,他是反应图像平面清晰度和图像边缘边缘锐利程度的一个指标。但是,并不是锐度调得越高越好。如果将锐度调得过高,则会在黑线两遍出现白色线条的镶边,图像看起来失真而且刺眼,同时界面噪点也更明显。

饱和度取决于改颜色中含有成分和消色成分(灰色)的比例。含色成分越大,饱和度越大。消色成分越大,饱和度越小。纯的颜色都是亮度饱和的,如鲜红,鲜绿。混杂上白色,灰色或其他色调的颜色,是不饱和的颜色,如粉红、黄褐色。完全不饱和的颜色根本没有色调,如黑白之间的各种灰色。

色度,颜色是由亮度和色度共同表示的,而色度则是不包括亮度在内的颜色的性质,他反映的是颜色的色调和饱和度。

亮度是指发光体表面发光强弱的物理量,人眼从一个方向观察光源,在这个方向上的光强与人眼所见到的光源面积之比,定义为该光源单位的亮度,即单位投影面积上的发光强度。亮度是人对光的强度的感受,他是一个主观的量。

对比度是指一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比度越大,差异范围越小代表对比越小。在比度对视觉效果的影响非常关键,一般来说就对比度越大,图像越清晰醒目,而对比度小,则会让整个画面都灰蒙蒙的。

licker是由工频率引起的,交流电光源都有光强波动,在中国交流电频是50Hz,光强波动100Hz, 周期10ms的整数倍。

如果不是10ms的整数倍,就会出现明暗条纹,就是50hz/60hz光源闪烁使曝光不均匀造成的。

光圈是光通过有效孔径
通常是一个用来控制光线透过镜头、进入机身内感光面光量的装置。他的大小决定着通过镜头进入感光元件的光线的多小。光圈越大,单位时间内通过的光线越多。
表达光圈用F值。光圈F值=镜头的焦距/镜头光圈的直径
光圈的作用在于镜头的进光量,F后面的数值越小,光圈越大。而进光量也就越多。

即图像信号处理器,主要作用是对前端图像传感器输出的信号做后期处理,主要功能有线性纠正、噪声去除、坏点去除、内插、白平衡、自动曝光。依赖与ISP才能在不同的光学条件下都能较好的还原现场细节。

暗电流指传感器在没有入射光的情况下,存在一定的信号输出,这是由于半导体的热运动造成的,他的大小和传感器结构及温度有关,大概每升高9℃,其暗电流会增加1倍,由于每个像素存在不平衡性,因此像素间暗电流也会不一致,造成电流噪声。一般情况下,在传感器中实际像素比有效像素多,像素区最靠边的行和列为不感光区,一般用作自动黑电平校正,其平均值为校正值。

原始像素只含一种颜色的信息,要重建色彩画面,就必须从相邻的像素中得到失去的信息。红色及蓝色插补一般遵循最近原则,进行平均处理,作为本像素的色彩值,由插值原理知,相邻像素间存在依赖关系,结果造成画面锐度的降低。

由于人眼可见光的频谱响应度和半导体传感器频谱响应度之间存在差别,还有透镜的影响。插补后得到的RGB值颜色会存在偏差。必须进行颜色校正,一般通过颜色校正矩阵来实现。具体的色彩校正参数,可以通过实验或从传感器供应商获得,当然要得到不失真的还原是不肯能的,只能反复调试达到最佳。一般通过标准色卡进行校正。

gamma 校正主要依据色度学原理进行调整,色彩在不同显示设备中频谱响应度不一样,造成颜色失真,失真成幂指数关系,因此调节相对简单

从最明亮到黑暗,假设人眼能够看到一定范围,那么胶片所能表现的远比人眼看到的范围小得多,而且这个范围就是感光宽容度。

视知觉是光接收细胞受到刺激并将入射能量转化为电脉冲后再大脑中产生。视知觉是关于实物世界以及我们把它们当做视觉刺激而产生反应的方式。

人的脑将不同频率的电磁波感知为不同的颜色。颜色被分为无彩色和有彩色两大类,无彩色是指白色。黑色和各种深浅不同的灰色。其他的颜色都是有彩色。颜色的区分常用3种基本特征量:辉度、色调、饱和度,辉度与反射率成正比,对色彩来说,颜色中掺入白色越来越多就越明亮,掺入黑色越多就辉度越小。色调和饱和度合起来称为色度。颜色可用色度和辉度表示

其中H定义颜色的波长,称为色调;S表示颜色的深浅程度,称为 饱和度 ;I表示强度或亮度。

从纸面出来越多越白,进入纸面越来越黑。
视知觉主要论述我们从客观世界接收视觉刺激后如何反应所采取的方式。他研究如何通过视觉形成我们关于外在世界空间表象,同时兼有心理因素。
在良好的光照条件下,人所能看到了的景物细节的准确性可以用视敏度表示,视敏度具体对应观察者所能看见的最小测试物体的尺寸,或者说在标准观察距离以及眼睛福安差最小测试物体的张角为l时所要求的距离比值,他代表能看清出景物精致细节的能力。

观察者检测在视野中某个给定物体是否存在。这里需要注意应将官学衍射的现象与觉察问题一起来考虑。由于衍射,一个场景中单独的光点聚焦在视网膜上时不再是一个点,而成了由一个中心圆盘及一系列围绕其四周的暗环和亮环所组成的模式。同样由于衍射,一条细线在视网膜上的映像总具有一个大于30的宽度,

观察者对两物体相对位置精确的辨别能力

在全黑条件下,理论上sensor感应到的电流值应该为零,但是由于暗电流的存在,形成了OB。

轮廓的构成用数学语言来说是轮廓对亮度的二阶导数。换句话来说,仅仅有亮度的变化并不产生轮廓。当亮度变化的加速度低于知觉轮廓的域值时,虽然眼睛注视物体,但是并不能看出其形状。轮廓不等于形状。

图形经常显示在前面,而背景显示在后面,背景看起来像是在图形背后连续延伸而不中断。

一块区域的对称性越强,越容易被看成图形,对称性本质上是一种规则性。在军事伪装中常用不同颜色和不同形状去破坏原有的图案就是这一规则的应用。

DxOMark 是一个为独立相机、 镜头 和搭载相机配件的移动设备提供图像质量评估的网站

IR-CUT双滤镜是指在摄像头镜头组里内置了一组滤镜,当镜头外的红外感应点侦测到光线的强弱变化后,内置的IR-CUT自动切换滤镜能够根据外部光线的强弱随之自动切换,使图像达到最佳效果。也就是说,在白天或黑夜下,双滤光片能够自动切换滤镜,因此不论是在白天还是黑夜下,都能得到最佳成像效果

俗称音圈电机,作用是调节镜头的位置,摄像呈现最清晰的状态女,目前大量应用于手机摄像头自动调焦

执行ISP调试的前提条件任务,创建新项目、生成初始化文件、将设置载入到设备上、使用设备拍摄图像以及执行PLD 选通

结合使用自动调试和手动调试多次反复调试,执行初步ISP调试。使用仿真功能和IQ评估工具随时评估调试结果。
仿真调试:在调试过程中,可以随时使用仿真功能,查看特定系列的调试模块对应的特定参数集合对raw图像有着怎样的影响。使用仿真器检查图像通过每个调试模块时得到的结果,以确定出现特定问题的位置。

可以选择使用chromatix实时调试功能作为加速获得调试结果的工具。利用实时调试功能,可将更新的参数推送到设备、使用新参数拍摄快照并立即载入使用该设备拍摄的图像。

每次调试会话后,使用调试好的设备拍摄新的测试图像,并使用chromatix IQ评估工具客观测量图像质量。

完成初步调试后,可能需要进行微调才能达到理想的效果,需评估需要进行那种微调,应拍摄真实场景的图像,以确定图像是否符合个人的偏好。回顾典型问题用例,了解关于微调特定ISP模块以达到理想效果的重要信息。

在本流程的这一阶段,生成包含已调试参数头问价并将设置载入带设备中。

chromatix调试项目会捕捉调试过程中设定的参数值和摄像头传感器模块信息。一个调试项目对应用于一个芯片组、一个头文件版本和一种摄像头模式。创建一个调试项目需要以下信息:

一种模式对应于一组具体的摄像头操作和条件,默认情况下,chromatix提供两种调试模式选项:快照和预览。这些模式用于调试初期,而其他自定义模式则可以按需创建并用于视频或其他操作。自定义模式可能需要从供应商处获取有关具体模式的传感器信息。chromatix为每种模式生成单独的头文件。通常使用一个项目来保存所有模式的参数,传感器驱动程序信息文件为chromatix提供调试所用传感器的相关信息。

如果之前已有调试项目,可使用现有头文件或预配置目标设备中的参数开始新项目。

A光源,钨丝光,即符合色温2856K的光源

传统型荧光灯即 低压汞灯 ,是利用低气压的汞蒸气在通电后释放紫外线,从而使 荧光粉 发出可见光的原理发光,因此它属于低气压弧光放电光源。
MTF50意义:MTF值为0.5时对应的空间频率(Cycle/pixel)值;
在各个摄像头镜头中经常采用MTF描述镜头的MTF曲线,表明镜头的能力,这些曲线是通过理想的测试环境下尽量减少其他系统对镜头的解析力的衰减的情况下测试得出的。

描述频率的单位,但空间频率的表述习惯用每毫米对,就是每毫米的宽度内有多小线对,每两条线条之间的距离,以及线条本身的宽度之比是个定值。 
通过这条曲线我们就能知道现在的成像系统在什么样的空间频率下的对比度如何。也就知道了在什么频率的纹理下的解析能力。

色差又称色像差,是透镜成像的一个严重缺陷,色差简单来说就是颜色的差别,发生在以多色光为光源下,单色光不产生色差。可见光的波长范围大约400至700纳米,不同波长的光颜色各不相同。其通过透镜时的折射率也各不相同,这样物方一个点,在像方则可能形成一个色斑,色差一般有位置色差,放大率色差,位置色差使像在任何位置观察,都带有色斑或晕环,使像迷糊不清么人放大率色差使使像带有色彩边缘,光学系统最重要的功能局势消色差。

图中的编号则代表则是色板的编号每一个小方格代表每一个标准色块所处的色彩,而小圆圈代表实际每一个色块的实测色彩。
首先观察13-18色彩的偏移量,若色彩偏移量很大,则说明常见色彩区域的色彩还原性较差,反之则好。
在其次观察1到12号色彩,及非常见色彩区域的偏移量,若色彩偏移量很大,则说明非常见色彩区域的色彩还原性较差,反之则好。

在之前官方宣传的拍照功能中,华为P30 Pro就具有超暗光拍摄的能力,ISO甚至高达409600,再加上了IMX 650更大的进光量,华为P30 Pro可以轻松应对夜晚拍摄环境。

智能可变光圈是今年最先亮相的创新型夜拍技术。智能可变光圈的光圈将范围设定在f/1.5-f/2.4之间,在暗光条件下,f/1.5的大光圈可以充分保证手机的进光量,进而在直出层面减少噪点。
从物理层面增加进光量是最直接手段,增加曝光时长,必然会增加画面进光量”

CIF为常用视频标准化格式简称(Common Intermediate Format)。在 H.323协议 簇中,规定了 视频采集 设备的标准采集分辨率。CIF = 352×288像素(水平像素×垂直像素),QCIF全称Quarter common intermediate format。QCIF也是常用的标准化 图像格式 。在H.323中,规定QCIF = 176×144像素

常规2D卷积滤波会使图像质量劣化,尤其在应用于bayer像素时,为了在降噪的同时不钝化边缘,可采用能够像素值调整期内核的自适应拜耳滤镜(ABF)。
ABF是一个两级低通滤波器:第0级用来消除高频噪声,第一级用来消除低频噪声,在每一级上,都有一个后接软阀值的低通滤波器,每个RGrGbB通道上也具有相同的处理模块。
为了降低噪声,设计了两个模块:
视频前端VFE管道上的ABF模块。
摄像头后处理器(CPP)上的小波降噪(WNR)模块。
由于两个模块均能实现降噪,因此有时OEM会禁用其中一个模块并仅仅侧纵欲调试另一个降噪模块。然而,由于ABF和WNR的适用领域不同,因此不建议禁用其中一个模块。
ABF用于在线性中处理像素,而WNR用于非线性YUV域,在输入图像通过RGB LUT、CCM、LTM、GTM模块后,噪声为非平稳噪声,因此,最好在线性域进行一定程度的降噪。

拜尔滤色镜 (英语:Bayer filter)是一种将 RGB 滤色器排列在光传感组件方格之上所形成的马赛克彩色滤色阵列。数码相机、录影器、扫描仪等使用的单片机数字 图像传感器 大多数用这种特定排列的滤色阵列来制作彩色影像。这种滤色器的排列有50%是绿色,25%是红色,另外25%是蓝色,因此也称做 RGBG GRGB ,或者 RGGB

简称LUT,是指一种通过修改色相、饱和度和亮度值,精确地将源图像的具体的RGB的值变为另一组新的RGB值的数学方法。LUT还可以用于为源图像创造具体的创意风格,比如漂白效果。

CCM是CMOS Camera Module 互补金属氧化物半导体 摄像模组的英文缩写,是用于各种新一代便携式摄像设备的核心器件,与传统摄像系统相比具有小型化,低功耗,低成本,高影像品质的优点。

私以为对CCD的原理有大致了解可以帮助我们对Beyer Pattern有更好的了解。我们知道镜CCD(Charge-coupled Device)通过滤镜将普通的入射光分为红绿蓝RGB三个分量。很容易联想到普通的图片每个像素点都包含RGB三个分量的信息,这很容易误导我们认为CCD也接收了每个像素点的三个通道的信息。然而并不是,原理图如下,每一个像素点CCD都只接收了RGB三个分量中的一个分量。一般而言是按照“RG/GB”的方式排列(对照图可以了解RG/GB其实是一个正方形的两行这么排列的)。

Bayer彩色滤波阵列是当前最为流行的彩色图像数字获取形式。三个颜色滤波的形式如下:

一半的像素点为绿色(G),四分之一的像素点分别是红色(R)和蓝色(B)。

为了获得色彩信息,彩色图像传感器覆盖有红色、绿色或者蓝色的滤镜,这种滤镜以相同的模式重复出现(上图中为RG/GB,也可以看做GR/BG)。滤镜的排列模式可以不一样,但是普遍使用的Bayer Pattern是2*2的阵列

Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS.

我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化

过来的. .raw格式内部的存储方式有多种, 但不管如何, 都是前两行的排列不同. 其

格式可能如下:

G R G R G R G R

B G B G B G B G

G R G R G R G R

B G B G B G B G

横为2的倍数, 竖为4的倍数, 它们构成了分辨率. 如, 上面则代表了 8 * 4 分辨率的

Bayer图.

我们要知道的是, G = 2 * R 及 G = 2 * B, 即绿色值为红色值或蓝色值的两倍, 因

为人眼对绿色更敏感, 所以绿色的分量更重.

分为数字增益和模拟增益,模拟增益指在模拟电路中把pixel输出的电信号进行放大,而数字增益是指电信号完成模拟转换后,把数字信号进行放大,把信号放大的作用主要是增加输出图像亮度,而增益越大的噪声也会相对更为明显,在实际项目中都需要根据sensor的具体情况确定最大和最小增益。

AEC曝光表通过传感器曝光时间和传感器模拟增益控制图像亮度。
目前sensor所采用的是滚动曝光的方式,即逐行曝光逐行读出,每行复位读出的时间间隔即曝光时间,曝光控制寄存器中数值代表曝光多少行:
曝光时间=曝光行数*行长。

chromatix工具基于调试项目中设定的参数生成一组可调参数,成为头文件。chromatix生成的头文件数量因芯片组和头文件版本而异,但始终会生成一个默认的头文件和一个通用头文件。在调试过程中,经常会重复生成头文件并加载到用于调试的设备中,以下是生成头文件的部分原因:
在拍摄用于初始化调试的图像之前,将最新的头文件加载到设备中,这样可以确保使用最新的传感器信息。曝光表和默认参数来拍摄用于调试图像。
在进行一次调试之后,生成新的头文件并将其加载到设备中,让后在使用调试后的参数拍摄图像进行评估,由于调试过程中反复进行,此任务可能会重复多次。
可以选择生成文本或二进制格式的头文件。要使用文本头文件(.h),需要将它们编译进目标版本并刷入设备中要使用二进制头文件(.so、.dat),可直接将他们复制到设备上,无需进行编译或刷写操作。
二进制头文件的前提条件:

Camera

1、获取Camera实例

  获取Camera对象的实例是直接控制相机的第一步。 作为Android自己的Camera应用程序,访问摄像头的推荐方法是在onCreate()启动的单独线程上打开Camera。 它可能需要一段时间,可能会陷入UI线程。 在更基本的实现中,打开摄像机可以延迟到onResume()方法,以便于代码重用并保持控制流程简单。如果摄像头已被其他应用程序使用,则调用Camera.open()会抛出异常,因此我们将其包装在try块中。从API级别9开始,相机框架支持多个相机。 如果使用旧版API并在没有参数的情况下调用open(),则会获得第一个后置摄像头。

private boolean safeCameraOpen(int id) {
    boolean qOpened = false;

    try {
        releaseCameraAndPreview();
        mCamera = Camera.open(id);
        qOpened = (mCamera != null);
    } catch (Exception e) {
        Log.e(getString(R.string.app_name), "failed to open Camera");
        e.printStackTrace();
    }

    return qOpened;
}

private void releaseCameraAndPreview() {
    mPreview.setCamera(null);
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}

2、创建相机预览

可以使用SurfaceView绘制相机传感器拾取的预览。 预览需要实现android.view.SurfaceHolder.Callback接口,该接口用于将图像数据从相机硬件传递到应用程序。

class Preview extends ViewGroup implements SurfaceHolder.Callback {

    SurfaceView mSurfaceView;
    SurfaceHolder mHolder;

    Preview(Context context) {
        super(context);

        mSurfaceView = new SurfaceView(context);
        addView(mSurfaceView);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = mSurfaceView.getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
...
}

必须先将预览类传递给Camera对象,然后才能启动实时图像预览。

3、设置并开始预览

  必须以特定顺序创建相机实例及其相关预览,并将相机对象放在第一位。 在下面的代码片段中,初始化摄像机的过程被封装,以便每当用户做某事来更改摄像机时,setCamera()方法都会调用Camera.startPreview()。 还必须在预览类surfaceChanged()回调方法中重新启动预览。

public void setCamera(Camera camera) {
    if (mCamera == camera) { return; }

    stopPreviewAndFreeCamera();

    mCamera = camera;

    if (mCamera != null) {
        List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes();
        mSupportedPreviewSizes = localSizes;
        requestLayout();

        try {
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Important: Call startPreview() to start updating the preview
        // surface. Preview must be started before you can take a picture.
        mCamera.startPreview();
    }
}

4、修改相机设置

相机设置会改变相机拍摄照片的方式,从缩放级别到曝光补偿。 此示例仅更改预览大小; 查看Camera应用程序的源代码可以获取更多内容。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    Camera.Parameters parameters = mCamera.getParameters();
    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
    requestLayout();
    mCamera.setParameters(parameters);

    // Important: Call startPreview() to start updating the preview surface.
    // Preview must be started before you can take a picture.
    mCamera.startPreview();
}

5、设置预览方向

  大多数相机应用程序将显示器锁定为横向模式,因为这是相机传感器的自然方向。 此设置不会阻止您拍摄纵向模式照片,因为设备的方向记录在EXIF标题中。 setCameraDisplayOrientation()方法允许您更改预览的显示方式,而不会影响图像的记录方式。 但是,在API级别14之前的Android中,您必须在更改方向之前停止预览,然后重新启动它。

6、拍照 

  一旦预览开始,使用Camera.takePicture()方法拍摄照片。 您可以创建Camera.PictureCallback和Camera.ShutterCallback对象,并将它们传递给Camera.takePicture()。

  如果要连续抓取图像,可以创建一个实现onPreviewFrame()的Camera.PreviewCallback。 对于介于两者之间的内容,您可以仅捕获选定的预览帧,或设置延迟操作以调用takePicture()。

7、重新启动预览

  拍摄照片后,必须重新开始预览,然后用户才能拍摄另一张照片。 在此示例中,通过重载快门按钮完成重启。也可以自己定时开启预览

  

@Override
public void onClick(View v) {
    switch(mPreviewState) {
    case K_STATE_FROZEN:
        mCamera.startPreview();
        mPreviewState = K_STATE_PREVIEW;
        break;

    default:
        mCamera.takePicture( null, rawCallback, null);
        mPreviewState = K_STATE_BUSY;
    } // switch
    shutterBtnConfig();
}

8、停止预览并释放相机

  使用相机完成应用程序后,就可以清理了。 特别是,必须释放Camera对象,否则可能会崩溃其他应用程序,包括自己的应用程序的新实例。

  什么时候应该停止预览并释放相机? 好吧,预览表面被破坏是一个很好的提示,可以停止预览并释放相机了,如Preview类中的这些方法所示。

public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    if (mCamera != null) {
        // Call stopPreview() to stop updating the preview surface.
        mCamera.stopPreview();
    }
}

/**
 * When this function returns, mCamera will be null.
 */
private void stopPreviewAndFreeCamera() {

    if (mCamera != null) {
        // Call stopPreview() to stop updating the preview surface.
        mCamera.stopPreview();

        // Important: Call release() to release the camera for use by other
        // applications. Applications should release the camera immediately
        // during onPause() and re-open() it during onResume()).
        mCamera.release();

        mCamera = null;
    }
}

 

以上是关于camera的构成的主要内容,如果未能解决你的问题,请参考以下文章

android 怎么从camera中获取流

如何让视频有camera

Camera2 vs Camera1

onFaceDetection(Camera.Face[] faces, Camera camera) 继续执行

使用Camera进行拍照

cesium 相机camera