MTK Camera 基础知识

文章目录

  • 数字成像系统流程综述
          • 曝光
          • 对焦马达
          • 镜头(lens)
          • MIPI数据与RAW数据的转换(未完待续)
          • ISP的主要内容和Bayer Raw的处理
          • RGB、YUV和YCbCr三种颜色空间
          • 补充 YUV(YCbCr)采样格式
  • 手机camera的功能
  • sensor 相关知识
  • logcat的使用
        • log开关
  • bat
  • shell脚本
  • XTS
  • M8添加awb
  • case案例
          • GPIO改为REGULATOR上电
          • GPIO-yangchangyun上电

数字成像系统流程综述

不同于胶卷相机和单反相机,手机中的Camera已经集成为一个整体的模组,感光sensor(芯片)为核心器件,其它组成器件包括镜头、音圈马达、eeprom等。其中的sensor IC,音圈马达和eeprom需要通过I2C进行控制,图像数据通过MIPI协议进行传输。其基本工作原理为:景物通过镜头生成光学图像投射到图像传感器表面上,产生电信号,经过A/D转换后变为数字图像信号,再将数字图像信号输出至手机的图像处理芯片(ISP)中。

相机模组的主要部件和图像处理关键节点:
MTK Camera 基础知识_第1张图片
ISP全称 Image Signal Processing,即图像信号处理,主要用来对前端图像传感器输出信号进行处理,匹配不同厂商的camera模组。事实上,ISP 除了图片上提到的主要功能外,还需要支持 DENOISE,CONTRAST,SATURATION,SHARPNESS 等调整功能,3A技术即自动对焦(AF)、自动曝光(AE)和自动白平衡(AWB) 3A数字成像技术利用了AF自动对焦算法、AE自动曝光算法及AWB自动白平衡算法来实现图像对比度增大、改善相机拍摄物过曝光或曝光不足情况、使画面在不同光线照射下的色差得到补偿,最终呈现出较高画质的图像信息,保证图像具有比较精准的色彩还原度。
MTK Camera 基础知识_第2张图片
模组结构的剖视图:
MTK Camera 基础知识_第3张图片
IR cut filter,即红外截止滤光片,它放在于Lens与Sensor之间。因人眼与CMOS Sensor对各波长的响应不同,人眼看不到红外光但sensor会感应,因此需要IR cut filter隔绝红外光,减少ghost图像,蓝玻璃是用来增加特定波段的蓝光。

模组结构的爆炸图:
MTK Camera 基础知识_第4张图片

曝光

快门的工作原理:
MTK Camera 基础知识_第5张图片
数码相机的快门有两道闸门,分别是:前帘、后帘。如上图所示,靠近镜头的闸门被称为“前帘”,靠近传感器的闸门被称为“后帘”。
在进行拍摄时,后帘从下往上打开,这个时候不会有光量,因为前帘还是闭合的。当后帘从下往上打开,然后前帘从上往下打开,画面从上往下进行曝光,这就是“咔”。等曝光结束后,后帘开始从上往下闭合,后帘闭合之后,整个曝光就结束了,这就是“嚓”。所以拍照时咔嚓、咔嚓、咔嚓的声音就是这么来的。等到前帘闭合后,就可以进行下一次曝光了。相机之所以有两个快门帘,就是为了能从上往下曝光,也能从上往下结束曝光。如果相机只有一个前帘,那么是从上往下开始曝光,当曝光结束就要从下往上了,这就会导致上面的曝光比下面多,如果你用非常快的快门速度进行拍摄,会导致画面的曝光程度不一致。
【剑桥摄影协会】相机曝光(Exposure)
https://blog.csdn.net/jiangsgyx/article/details/97166895
相机的ISO设置是什么
https://blog.csdn.net/culun797375/article/details/108840502
https://www.howtogeek.com/302755/what-is-your-cameras-iso-setting/
曝光是摄影中十分重要的一个环节,它决定了一张图片的明暗,如下图所示,第一张图片太暗,而第三张图片太亮。
MTK Camera 基础知识_第6张图片
曝光由光圈、曝光时间、ISO三者共同决定,对于手机以及其他电子产品使用的微型摄像头,光圈大小是固定的,所以手机拍照的曝光由曝光时间和增益 (gain) 来控制。自动曝光就是自动调节曝光时间、光圈、ISO进行曝光,使得所摄物体亮度正常。

自动曝光的标准:
物体的亮度与色彩是由物体对光线的反射率来决定的。例如纯黑色的反射率是0,纯白色的反射率是100%,处于中间的灰度的反射率是18%,这就是18%中间灰度。相机在各种场景下无法识别物体的反射率,于是统一将图像整体平均亮度设置为中性灰的亮度。该方法基于科学家认为自然界的平均反射率是18% 这一理论。当然,这个理论不是万能的,雪景的亮度肯定大于18%,白增黑减。

自动曝光的算法:
1、 均值法AE
Input = 255 * (Output/255) * Gamma
Output是我们期望的曝光输出值,也就是18%灰的曝光强度,Gamma一般都是2.2。在灰度卡上以0~255为计算区域的话,那么18%灰的Ouput就是122,Input就是50。也就是测光区域的实际曝光强度应该为50。

2、 N段式统计法
调节ISO最主要的副作用就是会同时增强噪点,如果把暗光下的图片放大多倍,噪点就会非常明显;通常是优先调节曝光时间,但是曝光时间也有个上限,必须要在33ms内完成才能保证每秒30fps的预览帧率。
N段指的就是ISO的不同段,优先保证ISO较小的情况下调节曝光时间,当曝光时间到极大值仍不能满足时再将ISO调大一级再重新调整曝光时间。
MTK Camera 基础知识_第7张图片
3、 平均亮度法
对图像所有像素亮度求平均值,通过不断调整曝光参数最终达到目标亮度。

1. 对当前图像进行亮度统计
2. 根据当前图像亮度确定曝光值
3. 计算新的曝光参数,曝光时间、光圈、增益
4. 将新的曝光参数应用到相机
5. 重复1-4,计算出一个目标亮度。

4、 曝光原理
Global Shutter
1、整幅场景通过同一时间曝光实现的,senor所有像素点同时收集光线,同时曝光,Global shutter需要对每个像素都要增加一个存储单元
2、曝光开始,sensor收集光线,曝光结束,光线电路被切断,sensor读出一整副图片
3、CCD就是Global Shutter,所有元素同时曝光
Rolling Shutter
1、 sensor逐行曝光,曝光开始,sensor扫描逐行曝光,像素点都被曝光
2、 所有的曝光快速完成,不同行曝光时间不同
MTK Camera 基础知识_第8张图片
成像效果对比
MTK Camera 基础知识_第9张图片
两种曝光方式的对比

Global shutter 曝光时间更短,但会增加噪声,所有像素同时曝光、适合快速移动的物体、不会扭曲物体图像
选择rolling shutter可以达到更高的帧速,但当物体曝光不当或者移动较快时,会出现部分曝光、斜坡图形、晃动等现象,可能会扭曲移动物体的图像,被称为果冻效应,像素逐行曝光、通常有更高的像素数量、适用于静止或缓慢移动的物体
MTK Camera 基础知识_第10张图片

对焦马达

对焦马达可分自动对焦AF、对比度对焦CAF和相位对焦PDAF,如果没有对焦功能,则该模组采用定焦FF。
(1)原理
VCM(音圈马达)的Driver IC是使用I2C控制,当AF算法找到焦点步数时,会利用I2C让Driver IC输出电流给VCM,VCM再移动镜头到实际位置。镜头在线圈中,线圈处在磁场中,线圈改变电流大小控制磁场的强弱,移动位置,实现了自动对焦。
(2)其它类型的马达
对比度对焦,又称为反差对焦,是目前使用广泛、成本低的对焦技术,具有成本低、精度高的优点,但也存在速度慢的缺点。
相位对焦,原理是感光元件上预留出一些遮蔽像素点,专门用来进行相位检测,通过像素之间的距离及其变化等来决定对焦的偏移值从而实现准确对焦;其具有对焦速度快,能够降低处理器计算负担的优点,也存在在弱光环境下容易对不上焦且成本较高的缺点。
激光对焦是利用光的反射的时间差来计算目标到测距仪器的距离。

PDAF
MTK Camera 基础知识_第11张图片
紫色光线代表经过上半部分透镜的光线,蓝色代表经过下半部分透镜的光线,可以看到,CCD在焦前的时候上半部分的CCD接收到的是上半部分的光线,下半部分接收的是下半部分的光线,在焦后的时候,是相反的,上半部分接收的是下半部分的光线,下半部分接收的是上半部分的光线。这样就可以通过区分光线是来自透镜的上半部分还是下半部分,就可以知道成像点是在焦前或者焦后了,当两条光线重合时,图像最清晰。
MTK Camera 基础知识_第12张图片
PDAF sensor的一种实现如上图所示,在CMOS上面一半的位置加了金属遮盖,这样,被遮住左边一半的像素点就只能接受右边来的光,同理,pair的被遮住右边一般的像素点就只能接受左边来的光。一般在CMOS中,遮住左边和遮住右边的像素点是在相邻位置会成对出现,通过检测这两个像素点的相位差,再通过算法解算出焦点位置,最后通过音圈马达移动镜头的位置,完成对焦。
验证方法
1、 将抓取PDAF log开关打开
2、 抓取log,按照mtk文档排查,读取confidence数据,confidence数据是一组数据,我们需要排查这组数据变化是否较大。
3、 PD线性度测试(在log里查找pdvalue与af位置,看他们是否是呈线性关系)
4、 肉眼看是否是一次性对焦到位,如果是相位对焦。如果不是反差对焦。
Type1、Type2、Type3的区别
1、 Type1:PD像素通过传感器校正,PD值通过传感器计算
2、 Type2:PD像素通过传感器校正,PD像素通过vc输出到isp
3、 Type3:PD像素通过ISP校正,PD像素通过isp从原始图像中提取PD像素由ISP3.0上的PDAF算法提取。
Vc是传输raw和pd像素的两个通道。

镜头(lens)

镜头是将拍摄景物在传感器上成像的器件,它通常由几片透镜组成。从材质上看,摄像头的镜头可分为塑胶透镜和玻璃透镜。
(1)光圈
光圈是安装在镜头上控制通过镜头到达传感器的光线多少的装置,光圈F值越小,光圈越大,进光量越多。
(2)景深
景深是指在摄影机镜头前能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈越大,景深越小,平时在拍人像时背景朦胧效果就是小景深的一种体现。
(3)焦距
焦距是从镜头的中心点到传感器平面上所形成的清晰影像之间的距离。根据成像原理,镜头的焦距决定了该镜头拍摄的物体在传感器上所形成影像的大小。比如在拍摄同一物体时,焦距越长,就能拍到该物体越大的影像,长焦距类似于望远镜。

Sonser主要分为两种,CMOS和CCD ,目前手机模组里用到的就是CMOS,CMOS图像传感器本质是一块芯片,主要包括:感光区阵列(Bayer阵列,或叫像素阵列)、时序控制、模拟信号处理以及模数转换等模块,主要作用把光信号转化成电信号 ,然后通过ADC 转化成数字信号。

ISP处理流程结构图如下:
MTK Camera 基础知识_第13张图片
图像Bayer格式介绍

为什么要使用Bayer ?
答: 对于彩色图像,需要采集多种最基本的颜色,如rgb三种颜色,最简单的方法就是用滤镜的方法,红色的滤镜透过红色的波长,绿色的滤镜透过绿色的波长,蓝色的滤镜透过蓝色的波长。如果要采集rgb三个基本色,则需要三块滤镜,这样价格昂贵,且不好制造,因为三块滤镜都必须保证每一个像素点都对齐,所以当使用bayer格式的时候,就解决了这个问题。
bayer格式数据排列?
答:Bayer格式是相机内部的原始图片, 即RAW图,是isp处理前的原始图片,由于人眼对绿色较为敏感,所以一般bayer格式的图片绿色格式的像素是r和g像素的和,bayer色彩滤波阵列,由一半的G,1/4的R ,1/4的B组成。

  1. bayer格式图像传感器硬件:
    MTK Camera 基础知识_第14张图片
    每一个感光像素之间都有Metal Opaque Laye(金属隔离层),光纤通过Microlens(显微镜头),在Color Filter Array(CFA) (色彩滤波器过滤) 之后,投射到相应的漏洞式photodiode silicon(硅的感光元件)上。

  2. Bayer感光阵列示意图:
    柯达公司的拜耳提出一种解决方案,只用一个图像传感器,但是在图像传感器的前面放置一个滤光层,滤光层的滤光点与图像传感器的像素一一对应,每个滤光点只能通过红、绿、蓝三种光其中之一。
    MTK Camera 基础知识_第15张图片
    这种可以通过不同颜色滤光点的排列是有规律的,每个绿色点的左上、右上、左下、右下分布的绿点,上下分布的是红点,左右分布的是蓝点。研究发现人眼对绿色最为敏感,所以绿点的数量是红点或者蓝点数量的两倍。
    那么图像传感器的每个像素只可能取四种可能的值:红、绿、蓝、黑(没有光透过)。
    现在得到的图像也只有四种颜色,显然还无法表达真实世界的颜色。所以还需要根据每个像素周围的颜色来近似恢复它原来的值,最后得到彩色图像。这个过程叫做“去马赛克(demosaicing)”。

去马赛克有不同的实现方法,简单的内插法,比如绿色过滤器的像素精确测量了绿色成分,而该像素红色和蓝色的成分则是从邻区获取。一个绿色像素的红色数值可由相邻两个红色像素内插计算出来,同理,内插相邻两个蓝色像素也能计算出蓝色数值。

由于人眼对绿色较为敏感,所以一般bayer格式的图片绿色格式的像素是r和g像素的和,如下图:Bayer色彩滤波阵列(Bayer Color Filter Array,CFA),由一半的G,1/4的R,1/4的B组成。
MTK Camera 基础知识_第16张图片
3. RAW data格式
RAW图像就是CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据,RAW文件是一种记录了数码相机传感器的原始信息,同时记录了由相机拍摄所产生的一些元数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”或更形象的称为“数字底片”。sensor的每一像素对应一个彩色滤光片,滤光片按Bayer pattern分布。将每一个像素的数据直接输出,即RAW RGB data,Raw data(Raw RGB)经过彩色插值 (DEMOSAIC ) 就变成RGB。

4.RGB565 与 RGB888转化关系,代码实现如下:

#define RGB888_RED      0x00ff0000
#define RGB888_GREEN    0x0000ff00
#define RGB888_BLUE     0x000000ff

#define RGB565_RED      0xf800
#define RGB565_GREEN    0x07e0
#define RGB565_BLUE     0x001f 
unsigned short RGB888ToRGB565(unsigned int n888Color){ 
	 unsigned short n565Color = 0;  
	 // 获取RGB单色,并截取高位 
	 unsigned char cRed   = (n888Color & RGB888_RED)   >> 19; 
	 unsigned char cGreen = (n888Color & RGB888_GREEN) >> 10; 
	 unsigned char cBlue  = (n888Color & RGB888_BLUE)  >> 3;  
	 // 连接 
	 n565Color = (cRed << 11) + (cGreen << 5) + (cBlue << 0); 
	 return n565Color;
}
unsigned int RGB565ToRGB888(unsigned short n565Color){
	 unsigned int n888Color = 0;  
	 // 获取RGB单色,并填充低位 
	 unsigned char cRed   = (n565Color & RGB565_RED)    >> 8; 
	 unsigned char cGreen = (n565Color & RGB565_GREEN)  >> 3; 
	 unsigned char cBlue  = (n565Color & RGB565_BLUE)   << 3;  
	 // 连接 
	 n888Color = (cRed << 16) + (cGreen << 8) + (cBlue << 0); 
	 return n888Color;
}
MIPI数据与RAW数据的转换(未完待续)

传感器采集的RAW数据通常为10bit(RAW8,RAW10,RAW12),存储RAW数据需要两个Byte,而其中有6个bit位是空着的,这样就有存储空间浪费。MIPI RAW数据充分利用了这个特性,采用5个Byte,共40bit存储4个RAW数据。那么怎么理解这个意思呢,下面通过一张图来解释(主要通过10bits来解释,其他格式是类似的)
MTK Camera 基础知识_第17张图片
如上图,加入10bits的raw图上又四个像素,像素值分别为341,242,273,840,那么他们在raw图中的存储方式就如途中红红绿绿的那一堆二进制,每个像素值都需要用两个字节来存储,也就是存储这四个像素值需要8个字节的空间。每个像素两个字节就有16bits的空间,但是实际值只有10bits,所以有6bits的空间是浪费的就如图中红色部分。而MIPI为了充分利用空间就将每个像素数据的高八位单独用一个字节存储,而低两位单独用一个字节存放,那么每四个像素就会多出8位,刚好可以再多用一个字节存储,存储方式如图用不同颜色表示,所以MIPI的方式存放4个10bits的数据只需要5个字节,节省很多空间。
raw->mipi

  1. 将两个字节的像素值右移两位就能得到高八位的数据直接存储为一个字节;
  2. 将四个字节的像素值强制类型转换为一个字节,也就是将高位舍弃,然后将得到的值与0x03位于就能得到地两位的值,用于存储到单独的一个字节中;
  3. 初始化一个单独的字节空空间每一位都赋值位0,然后将2中的到的一个字节左移n*2位(因为地位每两位都被前面像素值多出来的两位占据了),然后将初始化的这个字节与这个移位后的字节进行按位或操作即可;
  4. 将上面的操作重复四次,就能将四个像素值存储到五个字节中,具体代码如下
for(int i=0; i<4; i++)
{
    mipiRawArr[i] = (char)(orgRaw10BitsArr[i] >> 2);
    mipiRawArr[4] = mipiRawArr[4] | ((((char)orgRaw10BitsArr[i]) & 0x03)<< (2*i));
}

mipi->raw

  1. 先将一个字节存储的数据强制类型转换位两个字节的类型,然后左移两位,这样就能得到高八位数据;
  2. 将单独存储的那个字节左移2*n位然后与0x03进行按位与操作就能得到低两位数据;
  3. 将1中得到的两个字节的数据与2中得到的数据进行按位或操作就能完整恢复10bits的存储方式,具体代码实现如下
for(int i=0; i<4; i++)
{
	outRawArr[i] = ((outRawArr[i] | (short)mipiRawArr[i]) << 2) &0x3FF | ((mipiRawArr[4] >> (i*2)) & 0x03);
}
ISP的主要内容和Bayer Raw的处理

ISP 通过一系列数字图像处理算法完成对数字图像的效果处理。主要包括3A、坏点校正、去噪、强光抑制、背光补偿、色彩增强、镜头阴影校正等处理。ISP 包括逻辑部分以及运行在其上的firmware。
ISP 的控制结构如图,lens 将光信号投射到sensor 的感光区域后,sensor 经过光电转换,将Bayer 格式的原始图像送给ISP,ISP 经过算法处理,输出RGB 空间域的图像给后端的视频采集单元。在这个过程中,ISP 通过运行在其上的firmware 对ISP逻辑,lens 和sensor 进行相应控制,进而完成自动光圈、自动曝光、自动白平衡等功能,其中,firmware的运转靠视频采集单元的中断驱动,PQ Tools 工具通过网口或者串口完成对ISP 的在线图像质量调节。
MTK Camera 基础知识_第18张图片
ISP 的Firmware 包含三部分,一部分是ISP 控制单元和基础算法库,一部分是AE/AWB/AF 算法库,一部分是sensor 库。Firmware 设计的基本思想是单独提供3A 算法库,由ISP 控制单元调度基础算法库和3A 算法库,同时sensor 库分别向 ISP 基础算法库和 3A 算法库注册函数回调,以实现差异化的sensor 适配,ISP firmware 架构如图:
MTK Camera 基础知识_第19张图片
不同的sensor 都以回调函数的形式,向ISP 算法库注册控制函数。ISP 控制单元调度基础算法库和3A 算法库时,将通过这些回调函数获取初始化参数,并控制sensor,如调节曝光时间、模拟增益、数字增益,控制 lens 步进距离或旋转光圈等。

ISP处理Bayer image详细讲解
Bayer(拜耳滤波器得到彩色)
图像在将实际的景物转换为图像数据时, 通常是将传感器分别接收红、 绿、 蓝三个分量的信息, 然后将红、 绿、 蓝三个分量的信息合成彩色图像。 该方案需要三块滤镜, 这样价格昂贵,且不好制造, 因为三块滤镜都必须保证每一个像素点都对齐。
通过在黑白 cmos 图像传感器的基础上, 增加彩色滤波结构和彩色信息处理模块就可以获得图像的彩色信息, 再对该彩色信息进行处理, 就可以获得色彩逼真的彩色图像。通常把彩色图像传感器表面覆盖的滤波称为彩色滤波阵列(Color Filter Arrays,CFA)。
目前最常用的滤镜阵列是棋盘格式的, 已经有很多种类的, 其中绝大多数的摄像产品采用的是原色贝尔模板彩色滤波阵列(Bayer Pattern CFA)。R、G、B 分别表示透红色、透绿色和透蓝色的滤镜阵列单元。由于人的视觉对绿色最为敏感,所以在 Bayer CFA 中G分量是 R和B 的二倍,在每个像素点上只能获取一种色彩分量的信息,然后根据该色彩分量的信息通过插值算法得到全色彩图像。

1.BLC(BlackLevel Correction)------黑电平校正
在调试相机镜头过程,把设备放入封闭的密封箱中,会发现镜头呈现黑色,但是黑色的程度不够黑,这是由于暗电流的影响, 传感器出来的实际原始数据并不是我们需要的黑平衡(数据不为0),所以需要找到一个矫正值,然后将所有的区域的像素减去此矫正值,如果图像呈现纯黑色,说明矫正成功,左边未校验,右边是矫正后的图像。
MTK Camera 基础知识_第20张图片
2.LSC(Lens Shade Correction)------镜头阴影校正
由于相机在成像距离较远时,随着视场角慢慢增大,能够通过照相机镜头的斜光束将慢慢减少,从而使得获得的图像中间比较亮,边缘比较暗,这个现象就是光学系统中的渐晕,由于渐晕现象带来的图像亮度不均会影响后续处理的准确性。因此从图像传感器输出的数字信号必须先经过镜头矫正功能,消除渐晕给图像带来的影响。
常用的镜头矫正的具体实现方法是,首先确定图像中间亮度比较均匀的区域,该区域的像素不需要做矫正,以这个区域为中心,计算出各点由于衰减带来的图像变暗的速度,这样就可以计算出相应R、G、B通道的补偿因子(即增益)。下图左边图像未做镜头阴影校正,右边图像做了镜头阴影校正。
MTK Camera 基础知识_第21张图片
备注: 在项目过程中还可以把将头贴着对准白色物体,有时候由于镜头的原因,四个边角会产生暗角,像这些镜头加工工艺导致的问题,无法通过软件的方式进行修复。

3.BPC(Bad Point Correction)------坏点校正
常用检测方法是在全黑环境下看亮点和彩点和在盖白板的情况下看黑点和彩点。或者把镜头这个黑色物体,拍摄照片,然后观察,会发现图片上有坏点,并且是无规律的散列到图片的各个地方,由于图像传感器中CFA的应用,每个像素只能得到一种颜色信息,缺失的两种颜色信息需要从周围像素中得到。如果图像中存在坏点的话,那么坏点会随着颜色插补的过程往外扩散,直到影响整幅图像,因此必须在颜色插补(Demosaic)之前进行坏点的消除。

4.Bayer Denoise-----去除噪声
使用 cmos sensor 获取图像,光照程度和传感器问题是生成图像中大量噪声的主要因素, 当信号经过 ADC 时, 又会引入其他一些噪声. 所以,这部分主要是处理Bayer 图像的噪声。一般采用非线性去噪算法, 例如双边滤波器, 在采样时不仅考虑像素在空间距离上的关系, 同时加入了像素间的相似程度考虑, 因而可以保持原始图像的大体分块, 进而保持边缘。

5.Demosaic------颜色插值
在做这一步之前,必须做坏点矫正,不然做颜色插值的时候,都是通过相邻的几点像素点来算出当前像素点,坏点容易往外扩散。经过滤色板的作用之后,每个像素点只能感应到一种颜色。必须要找到一种方法来复原该像素点其它两个通道的信息,寻找该点另外两个通道的值的过程就是颜色插补的过程。由于图像是连续变化的,因此一个像素点的R、G、B的值应该是与周围的像素点相联系的,因此可以利用其周围像素点的值来获得该点其它两个通道的值。目前最常用的插补算法是利用该像素点周围像素的平均值来计算该点的插补值。
MTK Camera 基础知识_第22张图片
Remosaic 技术相关内容
https://www.jianshu.com/p/37814efa3b53
6.AWB(Automatic White Balance)------自动白平衡
人类视觉系统具有颜色恒常性的特点,因此人类对事物的观察可以不受到光源颜色的影响。但是图像传感器本身并不具有这种颜色恒常性的特点,因此,其在不同光线下拍摄到的图像,会受到光源颜色的影响而发生变化。例如在晴朗的天空下拍摄到的图像可能偏蓝,而在烛光下拍摄到的物体颜色会偏红。因此,为了消除光源颜色对于图像传感器成像的影响,需要引入自动白平衡功能,也就是模拟人类视觉系统的颜色恒常性特点来消除光源颜色对图像的影响。
MTK Camera 基础知识_第23张图片
白平衡就是让白色在任何色温下camera都能把它还原成白,由于色温的影响,一张白纸在低色温下会偏黄,高色温下会偏蓝,白平衡的目的就是白色物体在任何色温下都是R=G=B呈现出白色,比较常用的AWB算法有灰度世界,完美反射法等,原理如下:
1、在各个色温下(2500~7500)拍几张白纸照片,假设拍6张(2500,3500…7500),可以称作色温照
2、把色温照进行矫正,具体是对R/G/B通道进行轿正,让偏色的白纸照变成白色,并记录各个通道的矫正参数,实际上只需要矫正R和B通道,这样就得到了6组矫正参数(Rgain,Bgain)
3、通过以上流程,只需要知道当前场景是什么色温,再校正一下就可以了
MTK Camera 基础知识_第24张图片
7.CCM(Color Correction Matrix)------颜色校正
颜色校正主要为了校正在滤光板处各颜色块之间的颜色渗透带来的颜色误差。一般颜色校正的过程是首先利用该图像传感器拍摄到的图像与标准图像相比较,以此来计算得到一个校正矩阵,一般情况下,对颜色进行校正的过程,都会伴随有对颜色饱和度的调整。颜色的饱和度是指色彩的纯度,某色彩的纯度越高,则其表现的就越鲜明,纯度越低,表现的则比较黯淡。

AWB已经将白色校准了,CCM就是用来校准白色除白色以外其他颜色的准确度的,用一个3X3的CCM矩阵来校准,其中每一列系数r1+g1+b1等于一个恒定值1。Ccm矫正最终结果可以通过拍摄24色卡图片然后用imatest分析来做分析参考。
MTK Camera 基础知识_第25张图片
8.RGB Gamma------Gamma校正
现在常用的伽马校正是利用查表法来实现的,即首先根据一个伽马值,将不同亮度范围的理想输出值在查找表中设定好,在处理图像的时候,只需要根据输入的亮度,既可以得到其理想的输出值。在进行伽马校正的同时,可以一定范围的抑制图像较暗部分的噪声值,并提高图像的对比度。还可以实现图像现显示精度的调整,比如从l0bit精度至8bit精度的调整。上图分别是未做Gamma校正的,下图是做了Gamma校正的。
MTK Camera 基础知识_第26张图片
9.RGBToYUV
YUV 是一种基本色彩空间, 人眼对亮度改变的敏感性远比对色彩变化大很多, 因此, 对于人眼而言, 亮度分量 Y 要比色度分量 U、 V 重要得多。 另外,YUV色彩空间分为YUV444,YUV422,YUV420等格式,这些格式有些比原始RGB图像格式所需内存要小很多,这样亮度分量和色度分量分别存储之后,给视频编码压缩图像带来一定好处。

10.Color denoise / sharpness
主要是对yuv降噪处理,同时为了消除降噪过程中对图像细节的损失,需要对图像进行锐化处理,还原图像的相关细节(为了抑制图像的彩色噪声, 一般采用低通滤波器进行处理,例如使用M×N的高斯低通滤波器在色度通道上进行处理,在YUV 色彩空间上彩噪去除与边缘加强、色彩与对比度加强,中间还要进行自动曝光控制等, 然后输出 YUV(或者RGB) 格式的数据, 再通过 I/O 接口传输到 CPU 中处理。

RGB、YUV和YCbCr三种颜色空间

首先要说明,RGB、YUV和YCbCr都是人为规定的彩色模型或颜色空间(有时也叫彩色系统或彩色空间),其用途是在某些标准下用人眼可接受的方式对彩色加以说明,本质上,彩色模型是坐标系统和子空间的阐述。

  1. RGB
    RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开。它是最通用的面向硬件的彩色模型。该模型用于彩色监视器和一大类彩色视频摄像。
  2. YUV
    YUV是北美NTSC系统和欧洲PAL系统中模拟电视信号编码的基础。在 YUV 空间中,每一个颜色有一个亮度信号 Y,和两个色度信号 U 和 V。亮度信号是强度的感觉,它和色度信号断开,这样的话强度就可以在不影响颜色的情况下做出改变。YUV 使用RGB的信息,但它从全彩色图像中产生一个黑白图像,然后提取出三个主要的颜色变成两个额外的信号来描述颜色,把这三个信号组合回来就可以产生一个全彩色图像。

Y 通道描述 Luma 信号,它与亮度信号有一点点不同,值的范围介于亮和暗之间, Luma 是黑白电视可以看到的信号。U (Cb) 和 V (Cr) 通道从红 (U) 和蓝 (V) 中提取亮度值来减少颜色信息量,这些值可以重新组合来决定红,绿,蓝的混合信号。

YUV和RGB的转换:

  Y = 0.299 R + 0.587 G + 0.114 B
  U = -0.1687 R - 0.3313 G + 0.5 B + 128
  V = 0.5 R - 0.4187 G - 0.0813 B + 128
  
  R = Y + 1.402 (V-128)
  G= Y - 0.34414 (U-128) - 0.71414 (V-128)
  B= Y + 1.772 (U-128)
  1. YCbCr
    YCbCr 颜色空间是YUV的国际标准化变种,在数字电视和图像压缩(比如JPEG)方面都有应用。YCbCr 是在世界数字组织视频标准研制过程中作为ITU - R BT1601 建议的一部分,其实是YUV经过缩放和偏移的翻版。其中Y与YUV 中的Y含义一致, Cb , Cr 同样都指色彩, 只是在表示方法上不同而已。在YUV 家族中,YCbCr 是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。一般人们所讲的YUV大多是指YCbCr。

YCbCr与RGB的相互转换

  Y=0.299R+0.587G+0.114B
  Cb=0.564(B-Y)
  Cr=0.713(R-Y)
  
  R=Y+1.402Cr
  G=Y-0.344Cb-0.714Cr
  B=Y+1.772Cb
补充 YUV(YCbCr)采样格式

主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值),每 2 x 2 个点保存一个 Cr和Cb值, 图像在肉眼中的感觉不会起太大的变化。所以, 原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 每个点需要 8x3=24 bits, 而现在仅需要 8+(8/4)+(8/4)=12bits, 平均每个点占12bits。这样就把图像的数据压缩了一半上边仅给出了理论上的示例,在实际数据存储中是有可能是不同的,下面给出几种具体的存储形式:

  1. YUV 4:4:4
    YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特),经过8比特量化之后,未经压缩的每个像素占用3个字节。

下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

  1. YUV 4:2:2
    每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存(例如下面映射出的前两个像素点只需要Y0、Y1、U0、V1四个字节)。

下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的码流为: Y0 U0 Y1 V1 Y2 U2 Y3 V3
映射出像素点为:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

  1. YUV 4:1:1
    4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存。

下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的码流为: Y0 U0 Y1 Y2 V2 Y3
映射出像素点为:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]

  1. YUV4:2:0
    4:2:0并不意味着只有Y,Cb而没有Cr分量,它是指对每行扫描线来说,只有一种色度分量以2:1的抽样率存储,相邻的扫描行存储不同的色度分量,即,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0,依此类推,对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。

下面八个像素为:

[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 
[Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8] 

存放的码流为:

Y0 U0 Y1 Y2 U2 Y3 
Y5 V5 Y6 Y7 V7 Y8 

映射出的像素点为:

[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7] 
[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]

除了yuv4:4:4没有压缩外,其它几种,都是对色度数据做过压缩,YUV 的优点之一是基于人眼对色度的敏感程度要低于对亮度的敏感程度,可以适当降低色度的采样率,同时不会明显降低视觉质量, 下面的截图做了归纳总结,不同的格式是如何压缩以及如何映射出对应的像素点, 用圆圈圈起来部分,就是要存储的色度值。
MTK Camera 基础知识_第27张图片
YUV格式有两大类:planar和packed。

对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。

YUV采样的进一步说明
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的带宽。

YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,关于其详细原理,可以通过网上其它文章了解,这里我想强调的是如何根据其采样格式来从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。

用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。
MTK Camera 基础知识_第28张图片
总结起来,每个像素点的YUV分量一共占用的bit信息如下:
YUV 4:4:4采样,每一个Y对应一组UV分量, 每像素 24 位
YUV 4:2:2采样,每两个Y共用一组UV分量, 每像素 16 位
YUV 4:2:0采样,每四个Y共用一组UV分量, 每像素 12位

下面用一种表说明几种常见存储方式所占用的内存,以 w*h 大小的图像为例:
MTK Camera 基础知识_第29张图片
例如:w*h = 320*180
YUV4:4:4 :y:320*180, u:320*180, v:320*180, 即size=3*320*180
YUV4:2:2 :y:320*180, u:320*180/2, v:320*180/2, 即size=2*320*180
YUV4:2:0 :y:320*180, u:320*180/4, v:320*180/4, 即size=1.5*320*180

为什么视频编码使用YUV420而不是rgb,原因如下:

RGB格式:
该格式是从颜色发光的原理进行设计的,打个比方,每个像素点都有RGB这3个分量,相当于有红、绿、蓝这3盏灯,它们的光混在一起,颜色混在一起,亮度相加。
YUV格式:
相比于RGB格式,该格式可以节省内存,传输阶段可以节省带宽,根据对色彩的需求,调整UV分量的比例,使用起来方便灵活。所以从内存的角度来说,YUV格式的像素使用的内存更低,但是不影响显示效果,也可以认为RGB格式过度绘制图像,把人眼无法分辨的区域也进行了绘制。

下面看一下两者之间内存暂用对比,这里采用RGB24进行对比,RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。在一个2*2的像素区域,RGB格式使用的字节数为2*2*3=12字节,如果使用YUV格式,占用的字节数为4(Y)+1(u)+1(v)=6字节,其中Y占用4个字节,U和V各占用1字节,比例为4:1:1,所以在一个宽高为w*h的设备上,使用RGB格式编码占用的字节数为w*h*3,使用YUV格式编码占用的内存为w*h*+w*h/4+w*h/4 = w*h*3/2

YUV422内存排列如下:
MTK Camera 基础知识_第30张图片
MTK Camera 基础知识_第31张图片
YUV编码分类:
YUV420主要分为YUV420P & YUV420SP这两种格式

1.YUV420P:(YUV420 Planar)
又叫plane平面模式,Y , U , V分别在不同平面,也就是有三个平面,它是YUV 标准格式4:2:0
YUV420P: 主要分为两种格式YU12YV12:
YU12格式(安卓系统中,也叫I420格式):首先是所有Y值,然后是所有U值,最后是所有V值。
MTK Camera 基础知识_第32张图片
YU12:亮度(行×列) + U(行×列/4) + V(行×列/4)
YV12格式:首先是所有Y值,然后是所有V值,最后是所有U值
MTK Camera 基础知识_第33张图片
YV12:亮度Y(行×列) + V(行×列/4) + U(行×列/4)

可以参考此结构:
MTK Camera 基础知识_第34张图片
2.YUV420SP(YUV420 Semi-Planar)
是一种two-plane模式,即Y和UV分为两个plane,但是UV(CbCr)为交错存储,而不是分为三个平面
YUV420SP主要分为: NV12NV21
NV12的存储顺序是先存Y值,然后UV交替存储:YYYYUVUVUV,以 4 X 4 图片为例子,占用内存为 4 X 4 X 3 / 2 = 24 个字节
MTK Camera 基础知识_第35张图片
NV21(android的模式),android手机从摄像头采集的预览数据一般都是NV21,存储顺序是先存Y,再VU交替存储,NV21存储顺序是先存Y值,再VU交替存储:YYYYVUVUVU,以 4 X 4 图片为例子,占用内存为 4 X 4 X 3 / 2 = 24 个字节
MTK Camera 基础知识_第36张图片
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP

可以参考此结构:
MTK Camera 基础知识_第37张图片

手机camera的功能

小小的相机 APP 竟然有如此多的功能。

普通拍照
普通拍照就是手机第一次拿到手里打开摄像头 APP 之后的默认模式,也就是常驻模式,这个从我个人的使用体验上来看是使用率最高的一种模式。该模式下会有两种不同的拍照模式,一个是连拍、一个是单拍。不管是单拍还是连拍都可能会用到多个后置 Camera 设备(前置目前一般是只有一个),至于什么美颜啊、滤镜选择什么的这里不重点关注它,多是关心些最朴素的功能。

单拍
单拍现在一般都是多张照片合成的,目的是为了降噪,宽动态,提升图片质量,合成图片数量从 3~10 不等,一亿像素那种估计会稍微少几张,不然图片处理耗时就会比较长。现在的图像分辨率比较大,Sensor 的面积还比较小,都会采用多帧降噪的方式来获取比较好的图像质量。

连拍
触发连拍的方式就是按着拍照键不松,大概 1S 之后就会进入连拍模式,连拍一般就不会再去做多帧降噪了,就是单张连续的图片输出,比较接近于录像模式那种,连拍会有一定的图片数量限制,一般都是在 1000 次以内,这个是由规格去决定的,连拍的内部处理流程比较简单,复杂度也没有单张拍摄高。

拍照的时候是不允许切换摄像头的,这个在需求上也是合理的,在软硬件的实现上也是比较难以控制的。预览的时候是可以根据使用者选定焦距的不同而进行对应对焦范围的 Sensor 切换,并且拍照的切换过程是和录像不一样的,录像过程中是得允许摄像头进行切换的,这个在需求上也是比较合理的,软件上的实现也比拍照模式要好做一点。

现在大部分手机都有场景识别功能,算法内置会有几个常用的场景,比如人像、景物、夜晚、近焦远焦等等,有了多摄像头的存在,不仅识别会更好更快一点儿,针对不同的场景还可以切换摄像模式,最简单的焦距识别,一旦检测出来手机拍的是近景,就会主动触发 Sensor 切换到微距或者广角镜头来更好的拍摄,省去了手动调整的步骤。

目前主流的手机拍照功能也是有防抖的,不同于电子防抖(EIS),事实上拍照也做不了电子防抖,拍照时候用的是光学防抖(OIS),拿着手机轻微晃动可以看到后面镜头会跟着转动,画面当然更明显可以看出来光学防抖的作用。话说在之前的公司从电子防抖项目立项到算法设计、硬件 FPGA 验证、软件设计编写、产品化,也跟过一套流程,算法原理也了解过不少,很是羡慕手机上面动不动好几十帧的缓存序列,之前的产品都是内存省到家了,算法发挥的余地也不多(不知道有没有时间去写一个防抖算法专题,目前看起来电子防抖的应用还是挺广泛的)。
还有一个就是现在相机高像素 Sensor 都是用的 Quater Bayer 来做 RAW 的曝光处理的,具体的可以自行了解下,就是四合一的像素曝光,然后通过算法进行重采样恢复原始的分辨率,这个是因为硬件的 pixel 做的太小的话噪点会增加很多,成像质量不理想,算是成本和效果的综合考虑搞出来的方案。

录像模式
录像模式下会有开不开视频防抖的区别,以前手机上面对于视频录制的要求其实并不是特别地高,可能是因为像抖音这样的短视频 APP 还没有崛起的原因,现在逐渐的手机视频拍摄也被重视起来,什么防抖、画质、帧率等等都进行了不同程度的提升,现在手机的视频录制都在朝着电影级画质前进,当然肯定无法替代真的电影镜头拍摄,不过方向上在尽量接近。

手机上的录像目前防抖功能是必不可少的一个功能点,一般是光学防抖(OIS)和电子防抖(EIS)混合使用,但是据我对电子防抖的原理理解,它们融合到一起还是蛮难的一个点,原理上不是特别的兼容,这部分的算法整合是怎么做的我也不清楚。光学防抖比视频防抖有一个优点就是它不受环境光的变化而影响到防抖的效果,但是也由于硬件空间所限,它的防抖抑制没有电子防抖更好,但是光学防抖是不牺牲画质以及视场角的,所有的画面都是原汁原味的。而电子防抖必须得牺牲画质和视场角,视场角损失就不说了(所以都用超广角拍摄裁切来尽量保证视场角),都知道是为什么,画质也会有损失的原因是电子防抖要对原始采集到的视频做重采样,这部分需要进行插值,所以画质上会有稍许损失,另外由于算法原理,在夜间光照较低的情况下,会加剧画面的模糊程度,这是因为曝光时间较长的原因,理论上应该可以通过 ISP 调节来稍微改善,但是怎么都比不上光学防抖的画面。

录像模式会有 Live shot 功能,就是录像的时候可以点击拍照键来获取 JPEG 图片,当然这个图片的质量是没有拍照模式好的。录像模式也是可以有 HDR 功能的,一般实现是通过 Sensor 内部的 HDR 辅助功能再加上软件算法配合来完成,现在的 Sensor 内部支持好多种 HDR 的帧输出模式,比如比较普通的长短帧输出模式,还有交错曝光输出(一张 RAW 数据),索尼牛逼。

录像也有人像模式了,电影拍摄的时候经常会有突出重点的背景虚化视频,手机上面也逐渐通过算法加持支持这种模式了,具体的做法细节没了解过,不过像苹果的我看应该是用到了两个及以上的镜头进行辅助计算,通过近景远景结合的方式做视频虚化,目前的安卓手机上面倒是没有听说哪家特别宣传了这个功能,也可能是我消息不够灵通。

超级慢动作,华为有一款 7680 帧的超级慢动作模式,整了一款直出 1920 帧的 CMOS sensor,然后内部数据流处理应该是从 isp 到 SOC 后处理全部直通式不经过 DRAM,并且使用最新 C-PHY 标准,处理完毕的图像先一次性扔进 RAM 缓存,1S 大概 2.5G,RAM 里面先扔进去,然后再截取片段进行插帧处理到 7680 帧,即使是插帧也做得效果非常好,而且最终视频是 720P 的,清晰度也是很不错的。

超级夜景
以前貌似大家都不是非常关心手机夜景拍摄,夜景模式主要是通过长曝光来实现画面亮度提升的效果,但是依然会带来很多问题,比如噪点多,色彩不真实,手晃动导致画面模糊等等问题。在把握好场景的情况下,拍出来的晚上景色还是很漂亮的,晚上尤其是灯光的加持,让整个画面的色彩都更加绚烂,比白天有一种莫名的情调。

专业模式
专业模式其实就是开放一大部分参数给到用户自己去设置,比如常见的光圈、焦距、感光度、快门时间、锐度、镜头、白平衡等等。普通人一般用不到这个,这一大堆参数组合下来除非是专业摄影师,否则很难搞出来一张比自动模式更好的图片。专业模式是同一时刻只有一个摄像头在工作的,可以选择后置不同的镜头来完成拍摄任务,就跟单反换镜头差不多,当然单反一般不换感光 Sensor,手机上你没办法把镜头给拆下来换,只能连带着全部都给换了。

人像模式
人像模式一般都是固定后置 Sensor 使用的,比较常见的就是一个广角或者超广角加一个长焦,长焦镜头,非长焦镜头是用来做主拍摄画面的,长焦镜头来进行景深测量做背景虚化效果,并且 UI 上无法变焦,无法切换 Sensor 镜头。
之前用人像模式的时候基本上是需要手动定焦的,就是得在画面上面需要突出前景的地方点一下,然后才能获得比较好的虚化效果,并且虚化的前景物体有时候扣不干净,边缘总是会出现一些模糊,现在的算法基本上可以做到肉眼不可见的边缘模糊,但是不知道有没有自动定焦的,估计还是比较困难吧。
判断人像模式使用的哪几颗镜头可以试着单遮住一个后置镜头看看有没有画面的变化,虚化效果没有了的话就说明这个是用来测景深的,整个图都没有了的话说明是主图。

多摄像头到底有没有用
平滑变焦
小米6 是双摄,但是并没有用到平滑变焦上面,我发现唯一同时用到双摄的也只有人像模式了,还有第二颗摄像头起作用的模式我只发现了专业模式,专业模式可以选择长焦或者广角镜头,其余情况下小米6 我并没有发现有用到第二颗摄像头的场景。对于平滑变焦,可以拿手遮住其中一个镜头,然后调节 UI 焦距,会发现有那么一段时间视野是黑的。平滑变焦是为了模拟专业摄像头的真光学变焦,尽力达到无缝衔接,这里就用到了多颗摄像头的不断切换来完成此功能,摄像头切换也带来了很多bug 。

背景虚化
背景虚化需要用到几张图片联合对比进行虚化区域确定,单靠一个主打拍照的主摄像头很难或者说基本不可能做到,现在的手机上基本都有 Depth sensor 用于深度信息的获取。还有二值化的摄像头,二值化摄像头易于提取轮廓信息,有的手机上也装配了二值化摄像头辅助拍摄。

图像合成
某些场景下,存在这样一种算法,把长焦镜头的图像经过算法运算嵌合到广角镜头图像内部,增加图像的远部细节,不知道现在手机上有没有用到,应该是有用到的。或许还有其它模式的图像合成。

场景识别
上面也写了这部分,具体就是可以通过多摄像头的存在进行一个辅助场景识别,提升识别正确率以及进行对应的模式切换,单摄像头要做到这些相比来说还是比较难的。

多摄像头除了主摄之外新增的摄像头本质上都是为了弥补手机空间不够而先天缺少的一些功能,毕竟现有的硬件不可能把单摄做出花来,只能通过摄像头的数量来尽量弥补缺陷,事实多摄像头确实可以一定程度上获得比单摄像头更好的使用体验。

Google CameraX
B 站、Youtube 直接搜索 CameraX 就可以看到 Google 官方对 CameraX 的介绍。CameraX 是基于 Jetpack 的一个子项目,目的是为了提供比 Camera API2 更加灵活和简便的接口,把繁琐的线程、session 管理隐藏起来,也便于第三方的 APP 去使用 Camera,开放更多的多摄能力给到第三方 APP,也为短视频录制等第三方 APP 提供更多的玩法。

根据官方的介绍,这个 CameraX 有下面几个特点:
简化开发步骤,加入生命周期控制,不需要从程序代码角度再加入控制打开关闭摄像头的 APP 端代码。
为第三方 APP 开放 HDR 和人像虚化功能。
开放 MultiCamera 的功能给到第三方的 APP 使用。
总之,2020 年下半年就会出现 CameraX 的实际项目应用,第三方 APP 也将加入更多的 Camera 拍摄用法,对于 APP 开发者应该也是好事,简单了很多,可以更低成本搞出更多好玩的东西来。对于底层,需要去做很多的适配 。

sensor 相关知识

Image Sensor类型
(1)YUV Sensor
YUV Sensor输出的Data格式为YUV,图像的效果处理使用Sensor内部的ISP,BB端接收YUV格式的data后只进行格式的转换,效果方面不进行处理,由于Sensor内部的ISP处理能力有限,且YUV Sensor的数据量比较大(YUV422的格式1个pixel2个byte),一般Size都比较小,常见的YUV sensor都是5M以下
(2)Raw Sensor
Raw Sensor输出的Data格式为Raw,图像的效果处理使用BB端的ISP,BB端接收Raw data后进行一系列的图像处理(OB,Shading,AWB,Gamma,EE,ANR等),效果方面由BB端控制,需要针对不同的模组。
MTK Camera 基础知识_第38张图片
gain
gain是增益的意思,增益效应就是乘法运算(不同的数值乘以同一个数,数值越大的,乘完的结果更大),所以gain的默认值为“1”,图像不会有任何变化。但是如果增益不是1,而是比1大的数,这个时候对于越亮的部分就越有影响,对于暗的部分影响就没有那么大,最暗的部分0乘增益后还是0。

offset
offset是偏移的意思,其实就是加法计算,所有灰阶整体加一个数值或减去一个数值,即使颜色无论明暗全部统一增大或减小相同的数值,其导致的曲线变化就是整条曲线整体向上或向下移动,所以称为offset。其默认值为黑色,即RGB分量为0。在我们需要的时候,就可以将其值设定为我们想要的数值。

gamma校正:人眼对亮度的响应并不是一个线性的比例关系,而sensor的响应接近线性关系,调整对比度

https://mp.weixin.qq.com/s/YS_2agnfZl6Otm6tvGy_7A

MCLK主控给摄像头提供时钟
PCLK是像素时钟
HREF是行参考信号
VSYNC是场同步信号
多种输入接口:DMA (AXI 64-bitinterface)模式;
MIPI (CSI)模式(Mobile Industry Processor Interface)
ITU-R BT 601/ 656/ 709模式;
Direct FIFO (PlayBack)模式;
多种输出模式:DMA (AXI 64-bitinterface) 模式;Direct FIFO 模式;
FIMC(Fully Interactive Mobile Camera):摄像头采集的数据CPU无法直接处理,主控芯片里面集成了Camera控制器,摄像头先把图像数据传给控制器,经过控制器处理(裁剪拉升后直接预览或者编码)之后交给CPU处理。实际上摄像头工作需要的时钟(MCLK)也是FIMC提供的
camera的时钟域:系统时钟、PCLK、MCLK

CPI:camera parallel interface
APE:application processor engine
CSI:camera serial interface(bi-directional)

PDAF

【Camera专题】关于PDAF的一些知识 - 简书 (jianshu.com)

pdaf 全称 phase detection auto focus:相位检测自动对焦
dcc 全称 defocus conversion coefficient:离散转换系数,是镜头位置变化(DAC)与PD值变化(像素)的斜率

对于PAL信号和NTSC信号,两者PCLK分别为27M和27.2M
每一行的组成,一行是由4个部分组成:
行 = 结束码(EAV) + 水平消隐(Horizontal Vertical Blanking) + 起始码(SAV) + 有效数据(Active Video)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cRDk54dL-1658127226609)(E:\wing学习笔记\每日一记.assets\image-20220324133730663-16481002519832.png)]
为什么一行中的有效数据是 1440 字节? 因为PAL制式的SDTV或者D1的分辨率为 720*576,即一行有720个有效点,由于采集的是彩色图像,那么一行就是由亮度信息(Y)和色差信息(CbCr)组成的,由于是 YCbCr422格式,故一行中有720列Y,720列CbCr,这样,一行的有效字节数就自然为 720 x 2 = 1440 字节了。
BT656格式的数据一行组成需要1728字节,然后PAL有625行,NTSC有525行,两种制式的数据刷新频率分别是25HZ和30HZ,公式如下:
P A L : 1728 ∗ 625 ∗ 25 = 27000000 H Z PAL:1728*625*25=27000000 HZ PAL172862525=27000000HZ
N T S C : 1728 ∗ 525 ∗ 30 = 27216000 H Z NTSC:1728*525*30=27216000 HZ NTSC172852530=27216000HZ
画一张丑图
https://blog.csdn.net/codectq/article/details/104770082?spm=1001.2014.3001.5501
MTK Camera 基础知识_第39张图片
cci的名字叫camera control interface, 由两部分组成,一是i2c ,另一个是 gpio,即cci 包含i2c。一般情况,我们只用了i2c 部分,没有用gpio 部分。
cci 在硬件上设计更加抽象,他使用命令的方式操作i2c,或 gpio, 而不是同常的寄存器方式。 这样的好处是对于一个硬件,我们使用的接口更加集中,硬件模块隐藏了具体的硬件细节。

比如cci, 他就有i2c的命令队列,我们只是需要把相关的命令写到命令队列中就可了。 如果写一个终止命令,复位命令, 写命令, 然后开始执行, 这样的硬件实现了软件做的事情,驱动开发更加容易,更加稳定,效率更高。
cci 还有一个队列是gpio的队列,往这个队列中写cmd,可以控制gpio的配置。可以想一下,这样的硬件模块,也更容易集成。

CCI是IIC的一个子级,IIC的一些命令 CCI不一定能使用
MTK Camera 基础知识_第40张图片
相关常识

  1. 像素
    通常所说的“XXX万像素”实际是指相机的分辨率,其数值大小主要由相机传感器中的像素点(即最小感光单位)数量决定,例如500万像素就意味着传感器中有500万个像素点,和手机屏幕中的像素数量决定屏幕是720p或1080p分辨率是一个道理。通常会以为相机像素越高,拍的照片就越清晰,实际上。相机的像素唯一能决定的是其所拍图片的分辨率,而图片的分辨率越高,只代表了图片的尺寸越大,并不能说明图片越清晰。

  2. 高像素的优势
    更高像素的相机所拍图片的尺寸更大,假如我们想把样张打印出来,以常规的300像素/英寸的打印标准来计算,1300万像素相机所拍的4208×3120像素样张,可打印17英寸照片,而800万像素相机的3200×2400像素样张,打印超过13英寸的照片就开始模糊了。很显然1300万像素相机样张可打印的尺寸更大。

  3. 传感器是关键
    CCD和CMOS。CCD传感器虽然成像质量好,但是成本较高,并不适用于手机,而CMOS传感器凭借着较低的功耗和价格以及优异的影像品质,在手机领域应用最为广泛。CMOS传感器又分为背照式和堆栈式两种,二者系出同门,技术最早都由索尼研发,索尼背照式传感器品牌名为“Exmor R”,堆栈式传感器为“Exmor RS”。
    相对来说,传感器尺寸越大,感光性能越好,捕捉的光子(图形信号)越多,信噪比越低,成像效果自然也越出色,然而更大的传感器却会导致手机的体积、重量、成本增加。背照式传感器的出现,有效的解决了这个问题,在相同尺寸下,它使传感器感光能力提升了100%,有效地改善了在弱光环境下的成像质量。

  4. 镜头:越多越好
    镜头是将拍摄景物在传感器上成像的器件,相当于相机的“眼睛”,通常由几片透镜组成,光线信号通过时,镜片们会层层过滤杂光(红外线等),所以,镜头片数越多,成像就越真实。

  5. 光圈:越大越好
    光圈由镜头中几片极薄的金属片组成,可以通过改变光圈孔的大小控制进入镜头到达传感器的光线量。光圈的值通常用f/2.2、f/2.4来表示,数字越小,光圈就越大,两者成反比关系。
    它的工作原理是,光圈开得越大,通过镜头到达传感器的光线就越多,成像画面就越明亮,反之画面就越暗。因此,在夜拍或暗光环境下,大光圈的成像优势就更明显。除了控制通光量,光圈还具有控制景深的功能。生活中,我们时常会看到背景虚化效果很强的照片,不仅突出了拍摄焦点,还具有很唯美的艺术感,而这就是所谓的景深。光圈开的越大,景深越小,背景虚化效果就更明显。

  6. ISP芯片
    ISP芯片的作用就是对传感器输入的信号进行运算处理,最终得出经过线性纠正、噪点去除、坏点修补、颜色插值、白平衡校正、曝光校正等处理后的结果,ISP芯片能够在很大程度上决定手机相机最终的成像质量,ISP芯片分为集成和独立两种,独立ISP芯片处理能力优于集成ISP芯片,但成本更高。采用处理器配套的集成ISP芯片优势是降低了手机的研发和生产成本,但缺点是:
    (1)优秀的处理器厂商并不一定擅长开发ISP芯片,其成像质量不如独立ISP芯片;
    (2)无法保证与所选用的传感器契合,两者如果配合不好,对成像质量是有负作用的,这就限制了手机对传感器的选择;
    (3)当前相同价段的手机大多采用相同的处理器,相同的处理器就意味着相同的ISP方案,这就导致严重的同质化现象。
    独立ISP芯片是独立于处理器而存在的,虽然成本较高,但优势也是比较明显的。除了运算能力、成像质量更优秀外,一般的独立ISP芯片都是手机商向ISP提供商定制的,所以与相机其他组件的契合度更佳,成像也有属于自己的风格、特色。

解锁相关
1.首先挂载好手机(如果没有解锁先解锁)
2.进入 system/priv-app/WingCamera 下面删除掉WingCamera.apk或者更改后缀都行(WingCamera.apk.bak)
3.重启,查看下桌面是否没有相机图标了
4.没有的话就执行 adb install *******/WingCamera.apk 或者 adb push 本地apk路径 system/priv-app/WingCamera,然后重启

解锁方式:
1,打开开发选项
2,开发选项里边把OEM Unlock 打开
3,adb reboot bootloader
4,fastboot flashing unlock(需要要fastboot环境)
5,按音量上键(或者下键,不同项目不一样)----看到 finish后
6,长按power键或者 fastboot reboot
adb disable-verity

不能remount方法
进入setting,点击version超过5次进入开发者模式,之后点击system进入开发者模式将OEM unlock开关打开
adb root
adb reboot bootloader
fastboot devices
fastboot flashing unlock 之后按音量上键
fastboot reboot
adb root
adb disable-verity
adb reboot
adb root
adb remount
如果不行adb reboot重启一下即可

P98328平板解锁
1、 remount 需要先unlock设备,然后adb root, adb disable-verity, adb reboot之后再remount就可以了
2、 unlock设备方法如下:
a) Settings->开发者选项,打开oem unlock,(这一步建议刷PRC版本完成,使用ROW版本需要连接网络,并且最近的版本好像有问题)
b) adb reboot bootloader
c) fastboot flashing unlock,根据提示完成unlock
d) unlock过的设备,只要下次刷机没有改变分区的话,会一直处于unlock状态

装个驱动moto usb driver
adb reboot bootloader
fastboot getvar all

logcat的使用

Android性能测试adb相关指令
https://www.jianshu.com/p/17d35fbdc87e

adb shell setprop persist.vendor.mtk.camera.log_level 4
adb shell setprop vendor.debug.camera.log 3
adb shell setprop vendor.debug.mtkcam.loglevel 4
adb shell pkill camera*

在抓取log前,可输入命令:adb logcat -c 清除旧日志信息
输入命令:adb logcat -v time > logcat.log 开始抓取日志,同时在手机上复现问题

抓取kernel日志adb 命令:
adb root
adb shell setprop persist.sys.kernel.log logcat
adb shell dmesg > kernel.log

1.抓取对应等级以上的log,需要先打开反馈工具箱
然后 adb logcat [*]:[等级]>C:\Users\W8061180\Documents\LOG.txt

     等级分为V D I W E F
            V=verbose
            D=debug
            I=info
           W=warning
            E=error
            F=fatal
            S=silence (无记载,指用于屏蔽某些关键字。)
      [*]可以替换成任何指定的抓取内容,或者直接抓取| grep <指定内容>也可以。
     后面的路径各取所需。

2.批量push的一个小技巧

  $files = Get-ChildItem -Path .
  foreach($file in $files) {if(((Get-Date) - $file.LastWriteTime).Days -lt 1){ adb push $file /vendor/lib64 }}

这个操作可以将当前目录的所有今日更新文件推到手机的指定目录内(这里是vendor/lib64)

log开关

adb root
adb remount
adb shell setenforce 0
adb logcat -c
adb shell logcat -G 20M
adb shell setprop log.tag V
adb shell setprop vendor.debug.mtkcam.loglevel 4
adb shell setprop persist.vendor.mtk.camera.log_level 4
adb shell setprop vendor.debug.camera.log 1
adb shell setprop vendor.debug.ae_mgr.enable 1
adb shell pkill camera*

adb shell dumpsys media.camera

== Service global info: ==
Number of camera devices: 5
Number of normal camera devices: 3
Number of public camera devices visible to API1: 3
  Device 0 maps to "0"
  Device 1 maps to "1"
  Device 2 maps to "3"
Active Camera Clients:
[]
Allowed user IDs: 0 
== Camera service events log (most recent at top): ==
 06-18 07:36:34 : DISCONNECT device 3 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:54 : CONNECT device 3 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:54 : DISCONNECT device 0 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:52 : CONNECT device 0 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:52 : DISCONNECT device 3 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:50 : CONNECT device 3 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:50 : DISCONNECT device 3 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:47 : CONNECT device 3 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:47 : DISCONNECT device 3 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:44 : CONNECT device 3 client for package com.wingos.wingcamera (PID 6804)
 06-18 07:35:44 : DISCONNECT device 3 client for package com.wingos.wingcamera (PID 6804)

adb shell dumpsys media.camera > cameramedia.txt
adb shell getprop ro.product.cpu.abi

版本回退
repo forall -c ‘commitID=git log --before "2019-01-01 07:00" -1 --pretty=format:"%H"; git reset --hard $commitID’
也可以在别人可以编译的版本上创建快照,然后本地回退
MTK Camera 基础知识_第41张图片

bat

pull lsc

adb root
adb shell setenforce 0
adb shell rm -rf data/vendor/shading_otp
adb shell mkdir data/vendor/shading_otp
adb shell setprop vendor.debug.lsc_mgr.log 1
::adb shell setprop debug.lsc_mgr.log 1
::adb shell setprop debug.lsc_mgr.log 2047
adb shell pkill camera*
Echo /Please Open Mtk Camera!   Hit anykey to continue & pause > nul
adb pull data/vendor/shading_otp . 
set /p DUMMY=Hit ENTER to exit...

抓Log

adb root
adb logcat -c
adb logcat -G 200m
adb logcat -b all > E:\adbpull\devon\regulator_hal.txt

shell脚本

压力测试

1.分别编写两个脚本文件snapshot.sh和snapshot_20_shot.sh
2.机器烧最新nolog版本;设置adb可以正常使用;
3.依次执行下列命令:
adb push snapshot.sh /sdcard/
adb push snapshot_20_shot.sh /sdcard/
adb shell
cd  /sdcard/
4.三台机器依次操作上面步骤:
5.第一台机器进行普通拍照测试1000张:(使用snapshot.sh脚本)
a.打开相机,选择普通拍照模式界面
b.执行adb命令:sh snapshot.sh &
c.此时就在进行测试了,观察不在拍照时候,即拍照完成,取出照片看是否有绿照片。
6.第二台机器进行普通拍照测试1000张:(使用snapshot.sh脚本)
a.打开相机,选择HDR拍照模式界面
b.执行adb命令:sh snapshot.sh &
c.此时就在进行测试了,观察不在拍照时候,即拍照完成,取出照片看是否有绿照片。
7.第三台机器进行普通拍照测试2000张:(使用snapshot_20_shot.sh脚本)
a.打开相机,选择普通拍照模式界面
b.执行adb命令:sh snapshot_20_shot.sh &
c.此时就在进行测试了,观察不在拍照时候,即拍照完成,取出照片看是否有绿照片。

#!/system/bin/sh
rm -rf sdcard/DCIM/camera/*
for i in $( seq 1 )
do
for i in $( seq 1 10000)
do
	echo "camera handover $i"
    input tap 1000 200
	sleep 2
done
done

#!/system/bin/sh
rm -rf ../sdcard/DCIM/Camera/*
for i in $( seq 1 )
do
for i in $( seq 1 100)
do
	echo "camera handover"
    input touchscreen swipe 353 1124 353 1124 9500
	usleep 10000
done
done

PackageMaui.sh

#!/bin/bash
date=$(date '+%Y-%m-%d-%H-%M-%S')

cd ./out/target/product/k65v1_32_bsp/;
tar -czvf "Maui-$date.tar.gz" MT6765_Android_scatter.txt \
                              preloader_k65v1_32_bsp.bin \
			      logo-verified.bin          \
			      md1img-verified.img        \
			      spmfw-verified.img         \
			      scp-verified.img           \
			      sspm-verified.img          \
			      gz-verified.img            \
			      lk-verified.img            \
			      boot.img                   \
			      dtbo-verified.img          \
			      tee-verified.img           \
			      vbmeta.img                 \
			      vbmeta_system.img          \
			      vbmeta_vendor.img          \
			      super.img                  \
			      userdata.img

常用adb命令及gerrit
MTK Camera 基础知识_第42张图片
adb root: root 权限
adb remount: 挂载分区
adb push A B: 将文件A放在路径B中
adb install A:安装A文件(360相机)
adb reboot: 重启
adb shell “echo A >> B/C” 将语句A写到路径B下的C文件中
adb reboot bootloader: 进去fastboot模式
fastboot flash boot boot.img 在fastboot模式下烧录对应分区的IMAGE
fastboot flash dtbo dtbo.img
fastboot reboot: 退出fastboot并重启
MTK Camera 基础知识_第43张图片
ssh -p 29418 192.168.30.13
MTK Camera 基础知识_第44张图片
git config --list
MTK Camera 基础知识_第45张图片
git config --global user.name fanjibo01
git config --global user.email [email protected]
git commit --amend --reset-author

本地电脑tracert -d wtvdi1.wingtech.com 结果截图
MTK Camera 基础知识_第46张图片
在线查看寄存器数据
adb root
adb remount
adb shell “echo “3221 6600” >> /proc/driver/camsensor3”
adb shell “echo “3221” >> /proc/driver/camsensor3”
adb shell cat /proc/driver/camsensor3
批量替换
以下命令区分大小写
find ./ -name “ov5675_d5v15b” | xargs rename ‘s/ov5675_d5v15b/ov5675_ofilm/g’ //修改文件名
但是当目录结构如:A\A\A时,使用find ./ -name “A” | xargs rename ‘s/A/B/g’,会变成B\A\A
grep -rl ov5675_d5v15b ./ | xargs sed -i ‘s/ov5675_d5v15b/ov5675_ofilm/g’ //修改文件内容

不能remount方法
1.进入setting,点击version超过5次进入开发者模式,之后点击system进入开发者模式将OEM unlock开关打开
adb root
adb reboot bootloader
fastboot devices
fastboot flashing unlock 之后按音量上键
fastboot reboot
adb root
adb disable-verity
adb reboot
adb root
adb remount
如果不行adb reboot重启一下即可
看模组信息
adb root
adb shell cat proc/driver/camera_info
打开工模
adb shell am broadcast -a com.mmi.helper.request --ei mode 0
关机
adb shell reboot -p
录屏
adb shell screenrecord /sdcard/record.mp4
adb pull /sdcard/record.mp4
截图
adb shell screencap -p /sdcard/01.png
adb pull /sdcard/01.png
CQA绿色条纹
adb pull data/user/0/com.motorola.motocit/files/

常用网站
chrome://tracing/
http://ui.perfetto.dev/
画图网站
用户登陆活动图-GitMind
220309.drawio - diagrams.net

XTS

快速测试Camera VTS的一种方法
编译VtsHalCameraProviderV2_4TargetTest,或者在CTS测试包里面找到该Bin文件VtsHalCameraProviderV2_4TargetTest
push到手机data目录下
更改权限:chmod a+x VtsHalCameraProviderV2_4TargetTest
adb shell 登录到手机中,并进入到data目录下
执行测试所要测试的项:如getCameraCharacteristics
./VtsHalCameraProviderV2_4TargetTest --gtest_filter=getCameraCharacteristics

M8添加awb

#define LOG_TAG "CamCalCamCal"
#define MTK_LOG_ENABLE 1
#include  //#include 
#include 
#include 
#include 
//mutex
#include 
#include 
#include "camera_custom_nvram.h"
#include "string.h"
//cam_cal
#include "cam_cal.h"
#include "cam_cal_define.h"
extern "C"{
//#include "cam_cal_layout.h"
//#include "camera_custom_cam_cal.h"
}
#include "camera_calibration_cam_cal.h"
#include  //for rand?
#include 
//COMMON

                if (CalR!=0 &&
                    CalG!=0 &&
                    CalB!=0 )
                {
                    pCamCalData->Single2A.S2aAwb.rUnitGainu4R = (u32)((tempMax*512 + (CalR >> 1))/CalR);
                    pCamCalData->Single2A.S2aAwb.rUnitGainu4G = (u32)((tempMax*512 + (CalG >> 1))/CalG);
                    pCamCalData->Single2A.S2aAwb.rUnitGainu4B = (u32)((tempMax*512 + (CalB >> 1))/CalB);
                    rg = UINT16((CalR/CalGr)*512+0.5);
                    bg = UINT16((CalB/CalGb)*512+0.5);
                }
                if ( FacR!=0 &&
                     FacG!=0 &&
                     FacB!=0 )
                {
                    pCamCalData->Single2A.S2aAwb.rGoldGainu4R = (u32)((tempMax * 512 + (FacR >> 1)) /FacR);
                    pCamCalData->Single2A.S2aAwb.rGoldGainu4G = (u32)((tempMax * 512 + (FacG >> 1)) /FacG);
                    pCamCalData->Single2A.S2aAwb.rGoldGainu4B = (u32)((tempMax * 512 + (FacB >> 1)) /FacB);
                    rg_golden= UINT16((FacR/FacGr)*512+0.5);
                    bg_golden= UINT16((FacB/FacGb)*512+0.5);
                }
                CAM_CAL_LOG("rg_diff=%d,bg_diff=%d",abs(rg-rg_golden)*100/rg_golden,abs(bg-bg_golden)*100/bg_golden);
                if((abs(rg-rg_golden)*100/rg_golden <=10) &&(abs(bg-bg_golden)*100/bg_golden <=10)){
                     property_set("persist.vendor.main_awb.otp_check", "pass");
                } else
                     property_set("persist.vendor.main_awb.otp_check", "fail");

case案例

GPIO改为REGULATOR上电

ALPS07404844

powerOnSensor0: [name:imgsensor_isp6s&][imgsensor][regulator]fail to regulator_set_voltage, powertype:7 powerId:1800000
<7>[   81.873308][T103230] HwBinder:947_5: hi1634q_camera_sensor[capture_setting] [name:imgsensor_isp6s&]Hi-1634Q capture_setting start
<6>[   81.873496][T103230] HwBinder:947_5: [name:imgsensor_isp6s&]NOTICE: I2C id 66 write failed (-6)! speed(0=1000) (0x2)
GPIO-yangchangyun上电
目前前摄下电顺序已经是先拉高再拉低了,由于主摄和前摄三路电共用,所以需要在主摄上电完成后,重新对前摄进行复位,,是否有修改的方法
是的,共用LDO,该方案是由sensor厂提供的修改方式。
Dear MTK:
如电话沟通,附件为前摄SC500CS datasheet,配置的上电时序如下
SENSOR_DRVNAME_ELLIS_LCE_SC500CS_MIPI_RAW,
{
{RST, Vol_Low, 2},
{DOVDD, Vol_1800, 2},
{DVDD, Vol_1200, 2},
{AVDD, Vol_High, 2},
{RST, Vol_High, 2},
{SensorMCLK, Vol_High, 6},
},
和FAE沟通后,由于主摄三路电和前摄三路电都共用,一般项目上不会出现三路电都共用的情况,当主摄三路电都拉高时,使得前摄处于pwd异常状态,会有漏电情况,且目前从硬件上进行reset拉高再拉低的验证,证明该方案可以解决漏电的情况。
Dear Sir,
贵司这种算是客制化需求了,敝司的code暂时不支持类似的flow
看是如下修改是否达到贵司的预期?
148  static enum IMGSENSOR_RETURN gpio_set(
149    void *pinstance,
150    enum IMGSENSOR_SENSOR_IDX   sensor_idx,
151    enum IMGSENSOR_HW_PIN       pin,
152    enum IMGSENSOR_HW_PIN_STATE pin_state)
153  {
154    struct pinctrl_state        *ppinctrl_state;
155    struct GPIO                 *pgpio = (struct GPIO *)pinstance;
156    enum   GPIO_STATE            gpio_state;
157
158
159    if (pin < IMGSENSOR_HW_PIN_PDN ||
160  #ifdef MIPI_SWITCH
161       pin > IMGSENSOR_HW_PIN_MIPI_SWITCH_SEL ||
162  #else
163       pin > IMGSENSOR_HW_PIN_AFVDD ||
164  #endif
165       pin_state < IMGSENSOR_HW_PIN_STATE_LEVEL_0 ||
166       pin_state > IMGSENSOR_HW_PIN_STATE_LEVEL_HIGH)
167      return IMGSENSOR_RETURN_ERROR;
168
169    gpio_state = (pin_state > IMGSENSOR_HW_PIN_STATE_LEVEL_0)
170        ? GPIO_STATE_H : GPIO_STATE_L;
171
172  #ifdef MIPI_SWITCH
173    if (pin == IMGSENSOR_HW_PIN_MIPI_SWITCH_EN)
174      ppinctrl_state = pgpio->ppinctrl_state_switch[
175          GPIO_CTRL_STATE_MIPI_SWITCH_EN_H + gpio_state];
176
177    else if (pin == IMGSENSOR_HW_PIN_MIPI_SWITCH_SEL)
178      ppinctrl_state = pgpio->ppinctrl_state_switch[
179          GPIO_CTRL_STATE_MIPI_SWITCH_SEL_H + gpio_state];
180
181    else
182  #endif
183    {
184      ppinctrl_state =
185          pgpio->ppinctrl_state_cam[sensor_idx][
186        ((pin - IMGSENSOR_HW_PIN_PDN) << 1) + gpio_state];
187
188    }
189    /*pr_debug("%s : pinctrl , state indx %d\n",
190     *      __func__,
191     *      ctrl_state_offset +
192     *      ((pin - IMGSENSOR_HW_PIN_PDN) << 1) + gpio_state);
193     */
194
195    mutex_lock(&pinctrl_mutex);
196    if (ppinctrl_state == NULL ||
197      IS_ERR(ppinctrl_state) ||
198      pinctrl_select_state(pgpio->ppinctrl, ppinctrl_state))
199      pr_err(
200          "%s : pinctrl err, PinIdx %d, Val %d\n",
201          __func__,
202          pin, pin_state);
203
if(sensor_idx == 0 && IMGSENSOR_HW_PIN_RST == pin && GPIO_STATE_H  == gpio_state )//当是main sensor reset脚做上电时
{
ppinctrl_state =pgpio->ppinctrl_state_cam[1][((pin - IMGSENSOR_HW_PIN_PDN) << 1) + GPIO_STATE_H ];
if (ppinctrl_state == NULL || IS_ERR(ppinctrl_state) || pinctrl_select_state(pgpio->ppinctrl, ppinctrl_state))
pr_err( "%s : GPIO_STATE_H  pinctrl err, PinIdx %d, Val %d\n", __func__, pin, pin_state);
ppinctrl_state =pgpio->ppinctrl_state_cam[1][((pin - IMGSENSOR_HW_PIN_PDN) << 1) + GPIO_STATE_L];
if (ppinctrl_state == NULL || IS_ERR(ppinctrl_state) || pinctrl_select_state(pgpio->ppinctrl, ppinctrl_state))
pr_err( "%s : GPIO_STATE_L pinctrl err, PinIdx %d, Val %d\n", __func__, pin, pin_state);
}
204    mutex_unlock(&pinctrl_mutex);
205
206    return IMGSENSOR_RETURN_SUCCESS;
207  }

你可能感兴趣的:(嵌入式硬件)