14.学习Camera之——camera基本知识

2023-10-26

一 Camera模组    
      大家都知道,手机背面的那个小小的孔,就叫摄像头。这个小孔幽幽的泛着光泽,深邃又迷人,如同
一个含苞待放的小萝莉一样,这个小萝莉还是个傲娇娘,像零之使魔的614一样惹人怜爱,而且在小萝莉身体
里面,不对,是在小孔的里面,还有层膜…..哦,这是镀膜。 看了上面一段大家别惊慌,我不是猥琐的宅男,
我也有女朋友的……她叫姐崎宁宁……囧! 回到正题来吧。虽然Camera的构成大家都知道很简单,就是镜头+感光
芯片而已。不过大家也都知道光学成像是一门非常深奥且尖端的科学,这其中消费者可以拿来讨论的话题非常
之多。我们现在就来谈谈摄像头,从camera的构成开始

   Camera最概念性的结构框图,就是镜头+图像传感器+DSP。如果图像传感器类型是CCD,那么在图像传
感器采光后还需要一个A/D转换的过程。 下面具体介绍。

Camera结构一 图像传感器(Sensor) 

 一 感光二极管阵列 图像传感器(image sensor),这个大家都耳熟能详了,目前买个相机或手机,一般
都会标注sensor的参数,人们也都知道了,sensor是相机中最重要的器件之一,没错,是之一,不是唯一。 
Sensor的作用通俗点讲就等效于胶片相机的底片。两者的作用都是保存曝光时间内的光线数据,这些原始数
据就含有基色/亮度等成像的全部要素。 区别在于胶片要在暗房里面慢慢用光显影液和定影液冲洗出影像,
而sensor要经过数字信号处理和数据转换才能成为通用的影像格式。 大家也知道,Sensor的类型,按照工
作原理可分为两类CCD和CMOS。 CCD: 电荷耦合元件 CMOS: 互补型金属氧化物半导体 这两个名字非常拗口,
咱们略过,来说说他们的工作原理吧。 其实我觉得,我们能记住这些专业名词的,还是要记住。如果连名字
都记不住,就去研究原理的话,总觉得好像有什么奇怪的怨念混进来了。这就好比你看上个姑娘,追的死去
活来,终于追到手了,然后海誓山盟,各种美好,结果到领证登记时,登记员问你:未婚妻名字?你才拍脑
袋:我艹我老婆叫什么来着…? 对!就是这种感觉。 首先要说明,图像sensor既然要保存光线,首先要做的
就是能感应光线,即不同的光线照射到材料上,可以输出不同的信号电平。 CCD和CMOS就是对应两种感光
二级管的类型。以此带入后,大家都将这两种感光二极管所构成的sensor,简称为CCD和CMOS。 下面是CCD
和CMOS的感光二极管排列,看图也能看出来,因为感光二极管的构造不同,所以CCD和CMOS的感光阵列结构
也不同。CCD的阵列,是在一根总线后加A/D转换,而CMOS在每个感光二极管旁都加入了A/D转换(红色的二极
管标注)。

大家把视线焦点聚集在阵列图的总线上,CMOS结构的阵列有水平和竖直两条传输总线,而CCD只有水平或者竖
直一条传输总线。 那么大家就有疑问了,CMOS有两条总线,可以以坐标方式直接读取总线的电平来保存每个
像素的电平值,而CCD只有一条总线,怎么输出数据呢? 很简单,大学学过数电吧,CCD传出数据就是在时钟
信号同步下,一步一步的移位读出对应二极管的电平值。 这也就带出CCD和CMOS采集信息的不同点了。CMOS是
主动式输出采集的数据信息,CCD是在同步电路控制下被动式的输出采集的数据。 至此,CCD和CMOS的大多数
特性就可以解释了。 第一, CCD保存图像速度慢,不适合快速连拍。 你瞧,CCD传感器需在同步时钟的控制
下以行为单位一位一位的输出信息,速度当然慢,不慢不舒服斯基。 第二, CMOS保存图像速度快,适合快速
连拍。你瞧,CMOS阵列有坐标嘛,传感器采集光信号的同时就可以取出电信号,还能同时处理各单元的图像信
息,速度当然比CCD快,不快不舒服斯基。 第三, CCD耗电大。本来CCD感光二极管工作就需要多个源极,所
需要施加源极的电平很高(见图),加上CCD的阵列要在同步信号控制下一位一位的实施转移后读取,所以需要
时钟控制电源和三组电源供电,耗电当然大了。不大不舒服斯基。 第四, CMOS耗电小。CMOS传感器经光电转
换后直接产生电流或电压信号,信号读取十分简单,而且感光二极管所需的电压,直接由晶体放大输出,所以
需要施加在源极的电平很小(见图)。不小不舒服斯基。另外,大家还记得上面的摄像头结构框图吗?为什么
CCD传感器后面会有个A/D转换电路,而CMOS却没有?现在知道原因了吧?OK,再来说下一个话题。

 

CMOS之于CCD的弱点和优势。 在几年前,大家普遍存在一种说法,就是CCD画质比CMOS好。时至今日,这个说
法越来越站不住脚了,当然是CMOS传感技术在高速发展的结果。 说CMOS画质弱于CCD,其实也就是采集的数据
完整性不同罢了。 

  1. CMOS是主动式输出数据,阵列上每个点都要经过两条传输总线,路程长,虽然经过了放大,但传输时的
噪声引入多。 

  2. CMOS阵列的每个二极管旁边都有A/D,光电传感元件与电路之间距离很近,相互之间的光电磁干扰较为
严重,放大的同时可能带入的噪声也大。 

  3. 如上一点,CMOS因为二极管旁带有A/D电路,所以同样尺寸的sensor,CMOS的二极管能受到的光线面积
就小(其他的面积留给A/D电路),所以一部分光线被浪费了,受光弱于CCD的感光二极管,所以带入的一点小
噪声就会被放大。 

  4. CCD传感器制作技术起步较早,技术比较成熟,采用PN结和二氧化硅隔离层隔离噪声。 不过,近年来,
CMOS技术发展是一日千里,在中小尺寸传感器上,CMOS和CCD的画质区别已经很小了。CMOS可以通过改善微透
镜,在硅表面上掺入杂质等来减小噪声信号。(什么是微透镜?下面慢慢介绍) 这时候,大家又有疑问了,为
什么CMOS在发展,而CCD却没有技术更新了呢? 这个我只能说,CCD成本高又耗电,结构设计又复杂,谁TM闲
着没事去钻研它啊。而且CCD技术起步很早,发展的已经很成熟了,可改善的余地真的不算大。 感慨一下,说
起CCD和CMOS的发展,就好像猎人和海贼王一样。 猎人就是CCD啊,神作啊,可惜它是被富奸这个2B给画出来
的。于是可怜的猎人Fans等了八年,还没等到主角再次登场… 

 二 微透镜和滤光层 再来,就是微透镜了。 微透镜是什么?是镜头吗?错!给你打个叉。 微透镜不是镜头,
微透镜是CCD/CMOS传感器表面的一层小透镜阵列。 光线不是经由镜头,然后直接照射到CCD/CMOS的感光二极
管阵列上的。在光线射到感光阵列前,还要经过传感器表层的微透镜和滤光层。 在感光二极管之上,有很多微
型的透镜。这些透镜按照二极管的阵列排列,也就是每个感光二极管的上面都有附着一个微型透镜,即一个透
镜对应一个像素来排列。 下图为CCD传感器的纵向结构图。

为什么这种结构?聪明的读者已经猜到了。猜到的同学请举手,叔叔要奖励你一个轻轻的吻,不伸出舌头的那
种哦~~~ 微透镜的作用:初中物理老师都会告诉你,凸透镜用来聚集透射光线的。微透镜当然是用来聚集光线
的。 在阵列中,感光二极管的感光面有限,对应一格像素内的大部分面积是无效受光区域,所以要把阵列中每
格二极管前的光线集中起来,射到二极管的受光面上。 滤光层的作用:注意了,不是孙燕姿的绿光,是滤光。
滤光就是把色彩滤掉。保证每个二极管感受到的光是单色的。为什么要滤成单色光?把你生锈的脑袋转动起来。
前面说了感光二极管只能输出不同的电平,也就是只能表示光的强度而已,没办法表示颜色信息。也就是黄色光
和红色光,只要对应的亮度相同,二极管都会输出一样的电平信息。所以,聪明的开发者就在二极管阵列前面,
加个滤光层,指定这个二极管感受一种颜色的光强,光线中其他的颜色就去掉。这样每个二极管的输出信号就
对应为一种颜色的强度了。 这种做法的缺点是每个像素点得不到真正的信息,只能通过相邻像素的其他颜色强
度,来猜测自己这一格内的其他颜色强度,再把颜色组合起来,算出真正的颜色。这就是所谓的马赛克结构。 
目前市面上手机和相机传感器总数的99%是马赛克结构,也就是有先天缺点的。 最常见的马赛克结构就是RGB
三个基色相错排列,如下图。相机将每个像素格的基色信息综合起来,猜出每个像素的实际颜色和强度。

现在还有一种sensor,可以完美解决马赛克的这种先天缺点。就是适马开发的FOVEON X3传感器,其实就是
每个格子的感光电路,可以感受RGB三种基色的信息,缺点是在感光阵列上要加三层滤光层,光线强度会有损
失。 适马X3传感器也是被誉为最接近胶片原理的传感器,成像效果比常用的CCD/CMOS确实好很多。这个好理
解嘛,因为每格像素记录的都是全部的基色,不用靠相邻像素去猜了嘛。 不过很可惜,这种传感器目前只用
在适马自己的单反和专业DC上,而且卖的很贵。另外同样的尺寸下,X3传感器比较难以提高总像素数。

 

三 传感器尺寸和画质的关系 传感器尺寸大小对于画质的影响,其实跟之前一样,就是采集的光线数据的正确
性和完整性的不同。在像素相同的情况下: 1. 传感器面积越大,感光阵列的面积就越大,相邻感光电路的距
离就越大,加电时产生的电磁干扰就越小。 2. 传感器面积越大,感光阵列的面积就越大,对应单个像素的透
镜就能做的越大,聚集到的光线就越多,感光二极管受光后产生的输出电平就越高。假设噪声大小不变,那么
更大的有用输出电平,带来更高的信噪比,转换后的信息处理时正确率就越高。 3. 为什么在光线非常好的时
候,传感器尺寸大小间的差异会缩小? 因为即使传感器尺寸小,但是光线强度足够,每个感光二极管都能受到
足够的光线,产生的信噪比就大,噪点也就缩小了。 这就是为什么画幅大的单反和单电,比画幅小的手机和卡
片DC成像好的本质原因,当然也有镜头素质等其他原因。下图是各种画幅的大小对比。

 

(小知识:32×24mm之所以被称为全画幅,是因为这个尺寸和135胶片的尺寸很接近) 好了,关于传感器就
说到这儿。这里是个浅显的原理讨论,深入的半导体材料特性,驱动电路设计等不是我们关心的了。 另外,
关于CCD和CMOS的优劣,被人争论的太多太频繁了。无忌有个帖子讨论的比较深入,感兴趣的话可以搜索一下。 

Camera结构二 数字信号处理(DSP) 

  一 图像信号处理的目的 你像我一样,假期宅在家里,肚子饿了想吃碗泡面,然后打开冰箱拿出泡面,这个
泡面就是原始数据,是不能吃的。你要打开桶,撕开调味袋和酱袋,倒进桶中,再倒热水冲泡数分钟,然后才能
吃。这个过程就叫对数据进行处理。 这时候有人大叫:我吃泡面都是直接吃干面饼的。对于这种喜欢吐槽的魂
淡,我是不会理会的…… 关于图像信号的处理,我们先从需求上去探讨。 前文说过了,传感器一般为马赛克结
构,阵列输出的信号,在每个像素上都只是单色的,需要用相邻像素的色彩去猜测本像素的其他色彩。 这个由
传感器直接输出的,每个像素只有单色信息的数据,叫做Raw RGB数据。 而DSP的目的,就是把Raw RGB数据,
去通过计算和后期加工,变成真正的RGB或YUV格式的数据。 简而言之,DSP的主要工作,就是把Raw RGB格式
转换成RGB格式或者是YUV格式。

介绍一下各种颜色的数据格式吧。 

 1. RGB数据: 通用数据格式,因为理论上任何颜色都可以用红绿蓝三种基本颜色混合而成,所以RGB格式的
一个数据位由RGB(红绿蓝)三种颜色的比特位组来表示。 

   RGB格式有RGB565,RGB24,ARGB32等几种标准。 大家都知道,数据传输中,一个字节是8个比特 

    RGB565:共16比特,占两个字节。 其中5个比特表示R,6个比特表示G,剩下来5个比特表示B,所以一
共可以表示的颜色数为2^16 = 65536色, 其中红色R和蓝色B可表示为32种不同值,而绿色G可以表示为64
种不同; 

    RGB24:共24比特,占三个字节。 其中RGB三种颜色各种8个比特位, 所以一共可以表示的颜色数
为2^24 = 1677万色,每种颜色可表示成256种不同值; 

    ARGB32:共32比特,占四个字节。 其中RGB三种颜色各占8比特,剩下来8比特表示Alpha通道值, 
所以一共可以表示的颜色数为2^24 = 1677万色,每种颜色可表示成256种不同值。 但是因为加了Alpha值,
所以每种颜色还可以另外显示为256种不同的透明度; 好,说到这里,大家知道了屏幕参数中6万5千色,
26万色,1670万色是怎么来的了吧?

  另外RGB颜色在寄存器中的比特位顺序是BGR,所以写驱动时,定义的话是这么定义的: 

  typedef struct tagRGBTRIPLE { 

    BYTE rgbtBlue; // 蓝色分量 

    BYTE rgbtGreen; // 绿色分量 

    BYTE rgbtRed; // 红色分量 

  } RGBTRIPLE; 

  2. YUV数据: 说白了就是色差分量。大家的电视机上都有色差端口吧?色差端口传输的数据格式就是
YUV422。 YUV中,Y表示亮度信号,U和V表示色差信号。以前的黑白电视,是只有Y信号而没有UV信号,
所以只能表示灰度而不能表示色彩。 YUV数据和标准RGB数据互相转换公式: 

    Y = 0.299R + 0.587G + 0.114B 

    U = 0.147R - 0.289G + 0.436B 

    V = 0.615R - 0.515G - 0.100B 

    R = Y + 1.14V 

    G = Y - 0.39U - 0.58V 

    B = Y + 2.03U 

  3. Raw-RGB数据:前文所说,马赛克结构的CCD/CMOS,其感受光线后输出的原始数据只有灰度数据,
因为滤光层关系每个灰度数据只表示一种颜色的强度,所以Raw-RGB数据就是传感器输出的原始图像数据,
其中的颜色信息是不完整的,不通过计算插值出其他颜色信息的话,是还原不出完整图像的。 

 了解了图像处理的目的之后,我们来看看DSP的简单框图。下面一步步的来拆分。

 

1.图像传感器部分:前面已经说过了,没记住的把鼠标往上面滚动,慢慢看。ASP/AFE就是感光阵列的辅助
电路,控制信号抽样,感光时间长短(也就是曝光)等功能,跟模拟信号的处理相关。A/D部分前文也有说明,
所以这部分带过。 最后一点最重要:图像传感器输出的就是Raw RGB原始数据。 

 2.DSP部分:基本上信号处理模块中,90%的功能由ISP完成。ISP是什么?Image Signal Processing,
图像信号处理。 故名思忆就是处理图像的。ISP将由Sensor输出的原始信号处理成通用的成像数据,这些处
理过的成像数据可以直接被AP处理器或者基带芯片来使用,至于这些通用的图像格式数据,是再处理还是显
示还是保存,这就看应用需求了。 

 二 Pre-ISP 大家辛辛苦苦工作了一年了,准备带着家人去普吉岛度个假。难得出国嘛,总觉得不带个好点
儿的相机会有遗憾。于是赶早儿带着女儿去摄影城买相机去了。 到了摄影城门口有人发传单,起手接过一张,
佳能小马四,双Digic高速数字图像处理引擎,倍儿牛逼。 没走两步又有人塞了张传单,索尼A77,双Bionz
图像处理引擎,忒专业了。 于是您女儿就好奇了,拽着您的衣角问起来了,把拔把拔,这个图像处理引擎,
四什么东东啊?好吃吗? 回答不出来吗?不能在自己可爱的女儿面前丢脸啊。大丈夫萌大乃! 客官儿,
给您沏一壶茶,您坐着,一边品茶一边听我慢慢的道来。 

 目前市面上的相机厂商都有自己的图像处理引擎,其实就是一块封装了ISP以及其他功能的芯片。这块芯片
的主要作用,其实就是处理原始图像数据(Raw-RGB)。 首先啊,咱们说说这Pre-ISP,哎?您问我什么是
Pre-ISP? 嘿,敢情客官您眼力好啊,问我那算是问对人儿了。 Pre-ISP部分称之为前端影像处理,是把
原始图像数据处理为通用图像数据的最关键的一个部分,没有之一。各家的图像处理引擎中,最核心的也就
是这个Pre-ISP的部分,对应着不同的图像数据的转换和处理方式。 其实说白了Pre-ISP就是一个调整图像
的过程(PS的过程)。这个和你在电脑上用Photoshop或者光影魔术手去给你的图像拉曲线,调色调等是一样
的过程。 只不过ISP是直接处理Raw-RGB数据的,这个原始数据虽然是不完整的RGB颜色数据,但是没有失真
和画质损耗,处理Raw-RGB数据,所带来的画质损失是最小的。 而经过Pre-ISP处理过的数据,即RGB或者
YUV数据,虽然有了完整的颜色信息,但是画质已经有了一定的损耗。如果再把这个RGB或YUV数据编码压缩
成JPG格式,画面细节的损耗就更大了。 而我们一般是直接使用出片的JPG文件去更进一步的处理,在手机上
或者导出到电脑上进一步修改,这就是第三次对画质进行了损坏。 图像数据在各个处理流程中的画质损耗见
下图。

 

所以,现在很多相机都具备直接输出原始的Raw-RGB数据的能力,也就是所谓的RAW片。直接用专用的
工具打开这个RAW片,在电脑上进行加工,以减少处理中画质的损耗。这个过程其实就是摒弃了相机内
置的ISP过程,而直接自己处理原始格式。嗯,高手都这么做,高手都是鄙视直出JPG的“伪”射影师的,
我就在无忌上被鄙视过……千万别招惹那些摄影高手,他们会用他们丰富的经验在精神上推倒你,而且绝
对不肯准备杜蕾丝的。 关于RAW片为什么处理起来对画质损失最小,我再引用其他人的一段文字吧: 

  1. RAW文件没有白平衡设置,可以任意的调整色温和白平衡来进行创造性的制作,而不会造成图像质
量损失。 

  2. 可以转化成16位的图像,也就是有65536个灰度层次可以被调整,这对于JPG文件来说是一个很大
的优势。当需要对阴影区或高光区进行细致调整的时候,这一点非常重要。 

 OK,再来说说Pre-ISP的重要性。 Pre-ISP是对原始图像格式的第一次处理,这是非常重要的一次处理,
可以说是直接修改和优化了图像的内容,也就是直接决定了这个相机或手机的出片能力。 而Pre-ISP之
后的处理,比如转换为TIFF或者JPG等,都不会对图像的内容进行修改,只是在转换过程中会产生一点
画质的损失。 

 Pre-ISP所做的工作没有一个固定的流程,因为每个厂商都有各自不同的处理流程和风格,所以带入进
相机,体现出来的就是各家都有显著不同的成像风格, 佳能“媚”,尼康“锐”,宾得“惹人醉”等说法,
说的就是这个,当然,不同的成像风格和所使用的镜头也有很大的关系。 不过不管是什么Pre-ISP,一
定有色彩插值的过程。也就是把Raw-RGB中缺失的颜色通过一定的算法给算出来的过程。 如果你是直接
输出Raw片,那么在电脑上用软件打开Raw片时,软件已经做了色彩插值的计算处理了。(否则怎么能看
到图像呢..) 我这里给出一个一般的ISP都有的前端处理动作: 

  1. Black Level Calibration(暗电流校正) 这个过程一般集成在sensor中,但是严格来说也属
于ISP的一部分。 感光二极管,在没有光线照射时,释放电流应该为0吧?很可惜这只是理想状态。这
些无受光情况下释放的电流值称之为Black Level暗电流,是噪音,需要去校正后保存进寄存器里面,
作为补正系数。以后在光照情况下,才能将二极管的输出电流相应的进行加减补正。 

  2. Lens shading(镜头黑点校正) 小通光口径镜头比较严重的毛病,成像圈的外围进光量不足,
所以图像四周有暗角。 所以要预先提高亮度把这个问题处理掉。 

  3. Black Point Compensation(黑点补偿) 通过扫描每个像素及其四周像素的颜色和灰度数据,
侦测出纯黑的点,进行插值计算出合理的颜色及其灰度值覆盖它。 

  4. 平滑锐化 平滑+锐化,皮肤要平滑白皙,眼神要锐利凶狠化,这就是傲娇娘的基本属性。

  5. 色彩插值 这个就是前面所说的,基于马赛克sensor的ISP一定会有的步骤,把原始图像数据中
每个像素缺失的颜色给计算出来,算法很复杂哦,以后再说吧。 

  6. Gamma校正:就是对图像的伽马曲线进行编辑,以对图像进行非线性色调编辑的方法,检出图像信
号中的深色部分和浅色部分,并使两者比例增大,从而提高图像对比度效果。http://www.docin.com/p-69816832.html

  7. AE自动曝光补偿:通俗一点讲,就是为了画面的明暗度和细节、层次更加丰富,适当地加、减曝
光量。 

  8. AWB自动白平衡补偿:就是无论环境光线如何,仍然把"白"定义为"白"的一种功能,这样可以保
证色彩还原的准确性。 

  9. Color Matrix:对图像进行颜色方面的处理,通过使用颜色矩阵(ColorMatrix)来实现。从
而可以达到很多特效如黑白老照片、泛黄旧照片等等,
http://developer.Android.com/reference/android/graphics/ColorMatrix.html。 

  10. 饱和度/对比度/亮度调节 不知道的看Photoshop帮助文件去。 

  下图是一个CCD摄像头模块中,关于ISP的框图。可以看到Pre-ISP的流程为: 坏点侦测
(黑点白点)->基色白平衡转换->Gamma值补偿->色彩插值->色彩修正->色域转换->将RGB444转换
为YUV422格式输出。

 

至于其他ISP的处理流程,可以参见各个camera模组的datasheet。 总之,Pre-ISP就是机器内部,
对于Raw-RGB原始格式的一个PS过程。你这么理解就对了。

 三 Post-ISP 在ISP的框架中,Pre-ISP已经对原始图像数据进行过处理了,那Post-ISP是干嘛的呢?
 Post-ISP,即后端影像处理,其实就是做做后勤工作的,并不是上前线直接作战的。Post-ISP对于图
像的直接影响并不多,它主要负责数据压缩及后端接口界面等,还包括数据传输和控制等工作。

 

如上图,红色框内的控制模块就可以视为Post-ISP。 Post-ISP的作用繁杂,主要还是体现在控制上。 
控制什么?当然是控制拍照时相关的电路工作状态啊。 

 基本的控制项目: 

  1. 自动曝光控制(光圈+快门控制) 

  2. 自动白平衡控制

  3. 闪烁控制(对应工频干扰) 

  4. 闪光灯控制,连拍控制,视频摄录控制 

  5. 自动聚焦控制 

  6. 变焦控制 

  7. 等等等等 

 我们来挑选大家比较关心的说说。 

 Post-ISP控制项目之一 曝光控制(光圈+快门控制) 传感器中,感光二极管加电工作的时间,就是
曝光时间,也就是所谓的快门时间。 当传感器如果不加电,即使有光照射到表面,也感光二极管也
不会工作。 Sensor的曝光方式有几种,全帧曝光和逐行曝光等。 

  全帧曝光:Sensor通电后,所有的感光二极管是同时开始工作的,你只要控制Sensor加电时间的
长短,就能控制曝光时间了。CCD传感器因为原理的关系,只能全帧曝光。 

 逐行曝光:Sensor通电后,感光二极管是一行一行开始工作的,你必须控制是哪一行曝光,然后计
算总的曝光时间。 

 下面贴一段控制逐行曝光的驱动代码,以说明快门控制的过程。(camera模组是美光的) 

 函数解释: PVOID IIC_Write16bit(WORD addr, DWORD value) 

         [函数功能] 写寄存器 

         [参数] addr:寄存器地址; 

              value:要写入到寄存器对应地址的值 

         [函数返回] NULL 

         DWORD IIC_Read16bit(WORD addr) 

         [函数功能] 读寄存器 

         [参数] addr:要读出的寄存器地址 

         [函数返回] 从对应寄存器地址读出的值 

         PWOID WaitTime_ms(DWORD waittime) 

         [函数功能] 字面意思,等待 

         [参数] waittime:等待时间,单位毫秒 

         [函数返回] NULL 

 寄存器地址解释: 

         0x09: 存储曝光时间值 

         0xf0: 存储预置动作值 

         0xc8: 存储快门状态值 

   IIC_Write16bit(0xf0, 0x0000); 

   dataTemp = IIC_Read16bit(0x09); //读取曝光时间值 

   gCurbrightness1 = dataTemp; //快门时间存入变量,后续做处理 

   WaitTime_ms(10); 

   IIC_Write16bit(0x09, dataTemp*2/7); //写入新曝光时间值为原来的2/7 

   IIC_Write16bit(0xf0, 0x0001); //将所有要新写入的寄存器地址预置为1 

   IIC_Write16bit(0xc6, 0x2225); 

   dataTemp = IIC_Read16bit(0xc8); //读取快门状态 

   gCurbrightness2 = dataTemp; //快门状态存入变量,后续做判断处理 

   WaitTime_ms(10); 

   IIC_Write16bit(0xf0, 0x0000); //将所有要新写入的寄存器地址预置为1 

   IIC_Write16bit(0x65, 0xB000); // CLOCK_ENABLING 

   IIC_Write16bit(0x65, 0xE000); // CLOCK_ENABLING 

   WaitTime_ms(600); // Wait 1 frame time 

 以上就是驱动控制快门状态的简单案例。实际中比较复杂一点的camera模组,是不会这样去直接控
制快门时间长短的。Post-ISP已经内置了测光模式和光圈控制的过程,需要调试的就是一组辅助系
数而已。 

 一个camera的驱动中,快门调试往往是最繁琐的,需要大工作量的去调试代码。快门控制关系到最
CCD/CMOS最基本的保存光线数据的正确性,即原始图像数据的素质。如果连最基本的感光都做不到正
确,还谈什么图像处理呢?原始图像数据就是一堆没法还原的垃圾了,谁也不能把它变成黄金啊。 
另外的,像测光控制,因为手机的camera没有独立的测光元件和被测光路,所以都是直接用CMOS/CCD
来测光的,然后再Post-ISP中调整快门+光圈+ISO的组合。用CMOS/CCD来测光,优点是可以自由选择
测光点,不需要额外的测光系统,成本低,缺点是测光速度较慢,复杂光线下测光不准确等。

 Post-ISP控制项目之二 对焦控制

  大家都知道,如果摄像头素质高一点的话,一般都会带有AF功能。AF=Auto Focus,自动对焦功能。
 而Post-ISP可以控制VCM(音圈对焦马达)模块的状态,即实现了对焦点的控制。 关于自动对焦,这
又是一门非常精深的学问了,发展了几十年,衍生出了数百种对焦的技术。目前相机厂家的对焦方式
还不尽相同。我不太了解这么精深的学问,那么,我们就来说浅显一点的吧。 目前常见自动对焦的类
型分为相位检测自动对焦和反差式自动对焦两种原理,另外富士等公司也开发出大规模应用的新对焦技术了。 

   相位检测自动对焦: 多单反和高端DC采用。相位检测对焦,要在相机内部另外加一个线性传感器
(只用来对焦)和分离镜头。当开始对焦时,光线首先被反光板反射到分离镜头上,这时候主CCD/CMOS
是不工作的,而线性传感器是工作的。分离镜头会把光线分为两束,这两速光线经分离镜头后会重新
投射到线性传感器上,如果焦点是对准的,那两束光线会聚集到线性传感器表平面,则线性传感器的
感光二极管受到的光强最强。以此来做对焦的检测和预测。

   相位检测自动对焦的优点是快速,焦点准确。缺点是焦点需要经电路设计实现,不可触摸对焦,
而且实现复杂,暗光线下难以合焦(拉风箱)。

 

贴一段无忌的原话,来描述相位检测自动对焦的过程: 

  调焦准确时见图中(a),我们用AB来表示作为基准的一对CCD元件之间的距离。

  当调焦不准时,有两种可能性。一种是镜头焦点在被摄体之前,见图中 (b)。此时受光的两只CCD元件
之间的距离短于AB;另一种情况是镜头焦点在被摄体之后,见图中(c),此时受光的两只CCD元件之间的
距离长于AB, 根据受光的一对CCD元件之间的距离,就能鉴别出焦点是否准确。

  两只CCD元件所产生的电信号经过转换电路和模拟/数字转换电路,再送入照相机内的 CPU(中央处理单元)
,CPU按照厂家所设定的程序及根据这对CCD元件的距离与AB的差值,可计算出散焦量(即实际焦点与准
确焦点之差)以及散焦方向。 

 反差式自动对焦:多手机和卡片DC采用。就是传感器通电开始工作,不断的把画面通过DSP转换后传给
Post-ISP,Post-ISP就开始对不断的进行画面分析和比较了,控制对焦镜片来回移动,当检测到最佳的
反差时停止移动镜片。

 优点是结构简单,焦点自由选择,可改善余地大;缺点是对焦镜片需要来回移动(拉风箱),速度慢,
费电,焦点不准确。

 

于是,我们知道了,相位检测自动对焦和反差自动对焦的优缺点。 手机和卡片DC,受限于体积大小
和结构需要简化等因素,所以不会采用相位检测对焦。虽然这样的自动对焦准确性会降低,但也带来
了体积简化成本降低的好处,而且因为手机的摄像头一般不会有长焦端,所以对焦点精度的要求并不
需要那么高。 而且对焦技术还在不停的发展,未来如果出现了兼顾体积和精度的对焦技术,说不定很
快就会产业化,我们拭目以待吧。 关于Post-ISP其他的功能,对于并没有对图像进行直接处理,而
多和电路设计,ID设计有关,这里就略过不提了。

Camera结构三 光学镜头(Lens) 

    说到重点来了,可惜这个重点咱们要简短的说,因为我对于光学,实在是苦手一名。 相对于传感
器和DSP的飞速发展,光学技术的发展已经相当成熟。 一家以消费电子为研发主体的企业,想要转型为
专业相机研发企业,是非常困难的,如果不通过收购或者技术购买,想要开发出自己的光学系统,无疑
可能性非常的小。 这也就是光学技术的壁垒过高,长期的技术和经验累积,对于光学公司来说是非常
重要的。 你看,那些玩摄影的发烧友人,一般都会投入几倍甚至十倍与机身的金钱,去升级自己的镜
头群。而数万块天朝币的镜头比比皆是,甚至是一些玩家的标配头,挂机头。足以见光学素质,对于成
像的重要性。 光学特性对于一个相机或者手机来说,完全体现于镜头的光学素质。 而相比传感器来说,
光学特性对于画质,完全是覆盖级别的关系。成像所需的方方面面点点滴滴,光学特性的好坏对其都会
有直接影响。 然而因为过于博大和精深,我们这里不可能从透镜成像开始说起,也不可能一一介绍弥
散圆,像差,锐利判定等概念,当然后面涉及的信号与系统,什么Nyquist采样定理就更无从谈起了。
 当然,关于镜头的镜片数目和结构,以及镜片研磨,材料选用,透光率等,也就不说了,因为展开来说,
对于消费者的认知也没多大帮助。 咱们就从功能粗浅的说说,然后再粗浅的说说的镜头对画质影响,
反正咱就是个粗浅的大老爷们儿。

 一 功能性 

   镜头的规格最大程度的影响拍照的功能,以下说明可以去各大摄影论坛找教学贴来科普一下。 

   1. 焦段覆盖 焦段覆盖直接影响你的疲劳程度,也就是得走多少路。定焦么就是所谓 的变焦基本
靠走。 拍风景少不了广角,拍野生动物少不了长焦。 否则风光摄影师可能会因为走远一点而跌入悬崖,
而动物摄影师可能会因为走近一点被狮子吃了。 以上结论:焦段影响性命…… 

   2. 焦点 焦点直接影响视野角度,景深和透视感。 广角端入射角度大,光线强度高,景深大,透视
感强。 长焦端入射角度小,光线强度低,景深小,透视感弱。 

   3. 放大倍率,物距,最近对焦距离 简而言之影响微距效果。 

   4. 光圈 光圈直接影响曝光和景深,也就是影响快门时间和透视感。 有大光圈你可以提高快门时间,
减少手抖动带来的画面模糊,或者高ISO带来的画面噪点。 

   5. 特殊功能的实现 比如鱼眼镜头,移轴镜头,柔焦镜头等,实现特殊的画面效果。 这些特殊效果也
可以用后期处理来实现,不过处理带来的画质损失以及不自然感就看你自己选择了。能用前端的光学性能
达到的效果,就尽量不要用后期处理。

 二 MTF与画质 

   说到这里,我来问问大家,画质的评判标准是什么? 画面细节?画面纯净度?色彩还原? 呵呵,
其实,这些都可以用解像力来概括,或者被解像力间接的影响到。 解像力简单的说就是量度、计算影像
从清晰->模糊之间的转换点(通俗点称之为分辨率)。每一个镜头都有其分辨能力的极限,比如一个光学
分辨率为500万像素的镜头,你在它的成像圈内放一个1000万像素的CMOS传感器,那你是白瞎了这块CMOS了。 
简而言之嘛,镜头画质大部分和分辨率和反差有关。而MTF曲线,就是衡量一款镜头的分辨率和反差的曲线。
 下面我们就来说说MTF(Modulation Transfer Function),中文名称为调制传递函数。 首先快速介绍一
些概念: 正弦光栅:亮度按正弦变化的周期图形叫做“正弦光栅”;

 

空间频率:单位长度(每毫米)的亮度按照正弦变化的图形的周期数,单位是线对/毫米(lines/mm);
 最大亮度:设为Imax 最小亮度:设为Imin 调制度:M=(Imax-Imin)/(Imax+Imin) 
MTF值:设正弦光栅原本的调制度为M,而正弦光栅透过镜头后,到达成像平面的图像的调制度为M’,
则MTF值= M’/M 所以,MTF的值越接近1,镜头成像素质越好(光线通过镜头后解像力完全不变);
 S曲线和M曲线:镜头是光中心轴的中心圆形对称结构,像场中心各个方向的MTF值是相同的。
但是镜头有散性,在偏离中心的位置,沿切线方向的线条与沿径向方向的线条的MTF值是不同的!
S曲线:平行于直径的线条产生的MTF曲线称为弧矢曲线,标为S (sagittal);
M曲线:而将平行于切线的线条产生的MTF曲线称为子午曲线,标为M(meridional)。

 

空间频率很低时,MTF值趋于一个接近于1,即镜头对大尺寸色块的反差。随着空间频率增高,
MTF值逐渐下降,直到趋于0。肉眼分辨的反差极限是MTF = 0.03。 好,下面我们看看一张MTF图。

 

怎么样,看懂了吗? 图中共八条线,黑色线是在最大光圈下测试的镜头MTF曲线,蓝色线是在F8.0光圈
下车时的镜头MTF曲线。 粗线是用10线对/毫米的正弦光栅图测试的MTF曲线,细线是用30线对/毫米的
正弦光栅测试的MTF曲线。 实线是S曲线,虚线是M曲线。 可以看出: 

  1.越密集的正弦光栅,MTF值越小,解析力越差。 

  2.F8的小光圈,显然比最大光圈的解析力要好。 

  3.S曲线和M曲线并不重合,怎么镜头的子午和弧矢方向上,解析力并不相同。

  借贴一段解译MTF值的原话:     

   反差/明锐度:5(或10)lines/mm的读数反映镜头的反差表现.即使微小的差别(2.5%)也能在画面中
体现出来! 你可以把它看作一种最基本的"锐度".一枚好的镜头在光圈收小后应该在5 lines/mm下径向
和切向同时高于95% .低于90%即表明镜头表现不佳.一枚明锐度好而锐度差的镜头通常比明锐度差而锐
度高的镜头看上去更锐利!不过,锐度和明锐度两项指标通常相辅相成. 

   锐度:10至40(或更高) lines/mm表明一枚镜头的锐度——即再现细节的能力.40lp/mm表明镜头再现
物体非常细微细节(如人像摄影中的头发丝)的能力.此时即使MTF值的差距较大(如10%)也无法直接在画
面中辨认出来.按照人眼的辨别力和35mm胶卷的片幅,如果要得到质量非常理想的7英寸的照片,镜头20 
lines/mm下的MTF值必须大于50%.而要想在16英寸下仍有非常理想的画面质量,其70 lines/mm下的MTF值
竟须超过63%!几乎没有镜头可以达到这样好的表现! 怎么样?大家对镜头的画质有初步了解了吗?
以后别人跟你吹嘘自己的镜头有多牛逼时,你可以冲着他大吼:你丫给我上MTF,让我看看到底有多牛!!

二 拍摄功能相关的配置 
    什么是配置? 就是我把东西配好,放置在这里,你爱用不用。 你用或不用,它就在那里,不增不减。
 可不可以有一些配置,让我泪流满面? …… 不小心豆瓣了一把,大家可以跟我一起来文艺一下。 其实拍
照相关的配置,之于手机来说,无非就是Flash闪光灯+各种操控按键。 其他的比如什么光学取景器,热靴,
外闪环闪,脚架云台,在手机上都是不适合的。 谁也不会给自己的手机配个乐摄宝的摄影包,里面踹几
块砖头,背着出去冒充摄影师踏青吧。摄影师都喜欢黑粗大的相机,最好接一个竖拍手柄,再接一个黑
粗长的牛头,再挂着个牛逼闪闪的外闪,特专业的感觉。相机调到连拍,甭管看到什么,上去就是频闪
打机关枪,射对方一脸再说…… 扯远了。那么,咱们就手机可能的机体配置来说说吧。
 一:闪光灯
  手机用闪光灯一般有两种,大多数使用白光LED,少部分使用氙气闪光灯管。 大家知道,如果环境光
线很暗,你为了拍照需要补光的话,光一定不能是红橙黄绿蓝靛紫这种非主流喜爱的颜色,因为会降低补
光亮度,以及严重影响白平衡。 这就是为什么拍照用LED都是白光LED的原因。 白光LED有很多特性优于
氙气闪光灯管,比如更低的功耗,驱动电路设计简单,不需要充电电容,EMI干扰性小,频闪速度快等。
不过氙气闪光灯的高亮度和宽照明角度,就完全击败白光LED了。 所以,虽然成本以及设计复杂度来说,
氙气闪光灯完败于白光LED,不过对于追求拍照功能的手机来说,氙气闪光灯还是首选。 以下是白光LED
和氙气闪光灯的一些特性对比:

 

二:操控按键
  其实对于拍照按键来说,这是个贱人贱智的主观评价。 对于竖拍,单手直接在屏幕上操控比较容易,
所以只一个触屏也可以胜任。这时候对辅助的操控按键要求就比较低。 对于横拍,人如果将手机横过来
拍照,一般都是正儿八经的拍照,这时候对于抖动以及对焦的要求就比较高,一个专用的快门按键就显得
比较重要。 两段式的侧边快门按键,在横拍时,对于对焦和构图起到非常大的辅助,也由于食指可以搭
在侧边上,对于握持的稳定性来说,也有帮助

 

其他的,像什么模式转盘,WR拨杆,十字按键,焦点锁定按键,AE按键,预览按键什么的,就见鬼去吧。 
手机还要用来上网看电影玩游戏呢,而不仅仅是拍照,不可能为了这些按键而缩小屏幕面积或者增大机身
体积的,那是得不偿失的事情。
 三:取景器
  说到取景器,手机当然就是屏幕啦。 一个好的屏幕,对于拍照时的快感不言而喻啊。大家对于iPhone4
的拍照赞誉中,有一些成分是源于对取景时画面以及流畅度的赞誉,而这功劳当然首先归功于那块IPS的
Retina显示屏,其次归功于camera ISP算法对于流畅取景的贡献。 不过对于LCM,其实也没什么多说的,
这里展开估计会引来吵架了,引来IPS流AMOLED流ASV流OLED流之间的争执,所以,我们略过这里吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

14.学习Camera之——camera基本知识 的相关文章

  • 计算机网络输入一个URL全过程

    1 输入url时候 当我们开始在浏览器中输入网址的时候 浏览器他会从历史记录 书签等地方 找到已经输入的字符串可能对应的 url 然后给出智能提示 让你可以补全url地址 2 请求发起之后 解析这个域名 解析域名分为下面几个步骤 1 首先
  • CSS磨砂玻璃穿透效果 filter: blur(4px);

    文章目录 一 参考 二 问题描述 三 原理说明 四 项目代码说明 一 参考 纯CSS教你实现磨砂玻璃背景效果 附代码 二 问题描述 工作中 UCD 设计了一个 磨砂穿透 的效果 本想着画一个磨砂效果 然后在通过透明度穿透 实现 磨砂穿透 的
  • Xshell 常用命令大全 自用

    1 命令ls 列出文件 ls la 给出当前目录下所有文件的一个长列表 包括以句点开头的 隐藏 文件 ls a 列出当前目录下以字母a开头的所有文件 ls l doc 给出当前目录下以 doc结尾的所有文件 2 命令cp 复制文件 cp a
  • 特征选择(Feature Selection)

    主要内容 为什么要进行特征选择 什么是特征选择 怎么进行特征选择 特征选择 在现实生活中 一个对象往往具有很多属性 以下称为特征 这些特征大致可以被分成三种主要的类型 相关特征 对于学习任务 例如分类问题 有帮助 可以提升学习算法的效果 无
  • 【Spring源码】createBean()

    目录 1 resolveBeanClass 2 prepareMethodOverrides 3 resolveBeforeInstantiation 1 applyBeanPostProcessorsBeforeInstantiation
  • whisper模型 环境搭建与使用

    1 创建conda环境 conda create n whisper python 3 9 激活环境 conda activate whisper 2 安装whisper pip install openai whisper conda i
  • 计算机系统基础课程实验课bomb--phase_3

    首先栈指针减去24 应该是为了存储数组所需要 rcx存储栈指针加12的地址 rdx存储栈指针加8的地址分别作为第四第三参数 并且把0放入了返回值 eax中 然后可以看到输入函数的第二个参数地址为0x4025cf 通过x s查看内存的值为 即
  • java.lang.IllegalStateException: Found multiple @SpringBootConfiguration annotated classes [Generic

    该错误表示有重复的spring boot启动类 去掉重复的就行 项目是service工程里的测试部分加了一个springboot启动类 用于测试 但是该工程模块依赖于其他模块 如model模块和base模块的pojo类 因此注释掉base和
  • 搭建Vulhub漏洞测试靶场+成功环境

    可点击目录分类快捷浏览 官方地址 环境安装成功后做好快照 环境是否正常运行 检查docker是否运行 没运行则运行 进入对应漏洞文件夹 搭建及运行漏洞环境 官方地址 https vulhub org docs 环境安装成功后做好快照 我个人
  • 怎么可以有颜色的将matlab的代码复制到word中不产生乱码。

    我们直接将matlab中的代码复制粘贴到word中 就会产生如图的乱码 如果选择选择只保留文本 也能解决乱码问题 但是会将matlab原带的代码颜色消失 显得不美观 其实只要改正一下字体就可以解决这种问题 在matlab中设置一下字体就可以
  • Tomcat控制台中文乱码问题

    解决方案 第一 只修改java util logging ConsoleHandler encoding UTF 8下的编码格式 修改成GBK 不成功看第二 我用第一个配置就成功了 第二 在Tomcat根目录下 conf 子目录下的 log
  • Daily Scrum: 2012/11/7

    成员 角色 今天工作 明天计划 王安然 PM Dev 进行Craft类的供给Craft子类的编写 186 继续进行Craft CraftFactory类的编写 186 黄杨 PM Dev Art 完成粒子爆炸效果测试 199 基本样式的星空
  • 前端JavaScript面试技巧

    前端JavaScript面试技巧 第一章 课程简介 1 1课程简介 前端基础 1 2前言 网站前端程序开发分析 1 3几个面试题 typeof操作符 require命令加载ES6模块 SpringLoaded 1 4如何搞定所有面试题 获取
  • 【力扣练习题】加一

    package sim import java math BigDecimal import java util Arrays public class Add1 给定一个由 整数 组成的 非空 数组所表示的非负整数 在该数的基础上加一 最
  • eclipse环境搭建C++环境

    eclipse搭建C 编译环境使用eclipse CDT msys gcc gdb共4个软件 其中几个软件简单理解为 eclipse CDT 用于编辑软件文本 msys 管理使用的软件下载 gcc 用于编译 链接文件 gdb 用于调试 一
  • graphpad7.04多组比较p值_同是折线图为何你却这么优秀,这才是多组数据作图应该有的样子...

    相信大家对Excel做折线图应该不陌生 在展示数据的时候 图表是一种最好的展示方法 但是经常会碰到一种尴尬的事情就是 当数据维多比较多的时候 做出的图表就会显得非常难看 今天我们就来学习一下 多组数据怎么做折线图才好看 平民手中的折线图 当
  • 读书笔记-oo项目生存法则

    1 建立一个成功的项目的简单四步 1 采用增量式进度安排和阶段划分 2 拥有发现和改正错误的机制 3 建立一个良好的产品发布习惯 4 拥有优秀的项目负责人 项目经理和技术主管 2 相关概念 1 类是一组子程序和相关数据的集合 常用类图表示

随机推荐

  • springboot+flowable+mybatisplus初始化建表时如何指定数据源

    springboot flowable mybatisplus初始化表单如何指定数据源 问题描述 解决过程 直接上代码 问题描述 之前在自己的springboot当中集成了flowable 在集成flowable之前 springboot当
  • 直方图均衡化

    https www zhihu com question 37204742 answer 221844779 https zhuanlan zhihu com p 32857009
  • 明文传输漏洞

    业务系统对用户口令等机密信息的保护不足 攻击者可以利用攻击工具 从网络上窃取合法用户的口令数据 从而登录系统执行非法操作 攻击者可以利用监听工具在网络中窃取合法用户的口令数据 从而非法获取系统的访问权限 检测方法 通过burpsuite工具
  • OD-数列还原(python)

    数列还原 题目描述 有一个数列A n 从A 0 开始每一项都是一个数字 数列中A n 1 都是A n 的描述 其中A 0 1 规则如下A 0 1A 1 11 含义其中A 0 1是1个1 即11 表示A 0 从左到右连续出现了1次1A 2 2
  • C语言/C++基础之跨年烟花程序代码(附源码)

    C语言 C 基础之跨年烟花程序代码 程序之美 前言 主体 运行效果 代码实例 结束语 程序之美 前言 元旦将至 新年将至 转眼间2022年即将过去 崭新的一年正向我们缓缓走来 风花雪夜新年临近 入冬寒意随风吹进 繁星点点缀满天际 黎明晨阳元
  • 修改jar包中的class文件

    需求及准备 需求 现在有一个 jar文件 要修改其中某个文件的代码 准备 确保JRE已安装且环境变量已配置 安装Java Decompiler 官方地址为 http java decompiler github io 选择其中的JD GUI
  • Spring循环依赖源码debug详解

    1 什么是循环依赖 在Spring里 指两个或多个bean互相依赖 比如有两个Bean A B A中注入B B中注入A 这样就形成了循环依赖 Spring默认是支持循环依赖的 本文我们就从Spring源码层面对循环依赖进行分析 2 环境构建
  • Node.js学习四(文件流stream)

    文章目录 前言 一 Node处理缓存的方式 二 什么是Node js Stream 流 三 stream 流 的类型 四 创建可读流 五 拷贝文件 六 链式流 1 压缩文件 2 解压文件 前言 在我们学过fs模块后 可以知道读取文件时采用r
  • 12 shell命令之打包

    昨晚写的awk 说实话 对我而言 那是一个最复杂的命令 写得不是很好 可能在结构组织上面有很大的问题 后续有心得会再调整修改 本文将介绍linux的一组打包命令 这其中有我们最常用的tar 也有我们几乎没有见过的mksquansh 接下来就
  • 简明SQL截断和偏移指南:掌握LIMIT实现数据筛选

    以下是用到的表 截断 LIMIT 用于限制查询结果返回的行数 即最多返回多少行数据 例如 返回前两行数据 例如 从第二个数据开始返回两条数据 从0开始计算 偏移 OFFSET 用于指定查询结果的起始位置 即从结果集中的第几行开始返回数据 例
  • Spring使用——通过配置类注入Bean

    配置类 Configuration 告诉spring这是一个配置类 ComponentScan value指定要扫描的包 Filter excludeFilters default 扫描的时候按照规则排除哪些 ComponentScan v
  • App自动化测试 —— Appium的使用

    目录 简介 安装 配置 Run 问题 解决方案 优点 缺点 总结 简介 Appium是一个开源测试自动化框架 用于原生 混合和移动 Web 应用程序 安装 Appium安装方式有两种 一种是通过npm命令行安装 另一种是通过安装可视化工具
  • 华为OD机试真题 Java 实现【查找单入口空闲区域】【2022 Q4 100分】,附详细解题思路

    目录 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 一 题目描述 给定一个 m x n 的矩阵 由若干字符 X 和 O 构成 X 表示该处已被占据 O 表示该处空闲
  • c3p0 mysql 自动重连_C3P0官方对于MySQL8小时问题的解决方案

    前一段时间在做一个发邮件的程序 程序是用定时器 每晚凌晨定时发邮件 邮件内容需要从数据库中获取 运行了一天就出问题了 问题信息如下 com mysql jdbc exceptions jdbc4 CommunicationsExceptio
  • 计算机系统基础课程实验课bomb--phase_1

    首先呢 栈顶减8个字节 然后将 0x402400放入第二个参数以调用
  • 如何打造一个高效的研发团队

    互联网公司的成功很大一部分归结为人才储备 如何打造有活力 持续创新的研发团队 相信很多管理者都比较关心 下面我们从业务支撑 技术架构 团队建设这几个方面做简单剖析 业务支撑 快速发展已经成为互联网公司的一种常态 那么在这么快的节奏下 如何快
  • python自动化赚钱-薅羊毛

    1 目 标 场 景 最近 有一个朋友告诉我 她在某平台上购买了一部手机 收到货之后发现商品质量挺好的 价格也不贵 临了随手给了个好评 商家最后还给她发一个 小红包 她把这个商品分享给了我 本篇文章的目的是利用Python 自动化完成商品购买
  • 好用的vscode vue3插件

    可能不全 但是是自己用的比较舒服的配置 包括高亮 class类名提示 引用跳转 模板快速创建 插件列表 1 别名路径跳转 2 Atom One Light Theme 3 Auto Rename Tag 4 Chinese Simplifi
  • 在R语言中使用stress.labels参数为可视化图像中的强调线添加标签信息

    在R语言中使用stress labels参数为可视化图像中的强调线添加标签信息 在数据可视化中 我们经常需要突出显示某些线条或数据点 以便更清楚地传达信息 在R语言中 我们可以使用stress labels参数来为图像中的强调线添加标签信息
  • 14.学习Camera之——camera基本知识

    一 Camera模组 大家都知道 手机背面的那个小小的孔 就叫摄像头 这个小孔幽幽的泛着光泽 深邃又迷人 如同 一个含苞待放的小萝莉一样 这个小萝莉还是个傲娇娘 像零之使魔的614一样惹人怜爱 而且在小萝莉身体 里面 不对 是在小孔的里面