【Android Camera开发】深入理解相机ISP(图像信号处理)必看文章

news2024/11/19 21:18:21

​原文:https://blog.51cto.com/u_16081664/6224003

作者:mb64411cc0e9333

凡是和图像领域工作的人,都会经常听到ISP(Image Signal Process,图像信号处理),知道ISP对图像质量非常重要。比如华为和小米竞争手机拍照和录像效果,主要的竞争领域就是ISP;做AI(Artificial Intelligence,人工智能)的人也知道,如果ISP不给力,后续的AI处理效果会受到影响。

成像引擎

ISP在图像输入流中的位置如下(图中的成像引擎): 

我们带着以下问题来了解isp

为什么相机的CMOS传感器(Sensor)输出的原始数据(raw data)不能做好一点,不要让ISP做这么复杂?

现在的ISP通常做了哪些工作,每个工作的原因是什么?处理的原理是什么?哪些处理对于图像效果最明显?哪些处理比较成熟?

接下来我们就来回答。

Sensor输出的原始数据和人类预期的图像有巨大差异

需要ISP模块的原因有2个方面:

一个是镜头和Sensor的物理缺陷(不完美)

二是拍摄的光线条件多样,镜头和Sensor需要根据环境做适应(就像人眼要通过瞳孔缩放,适应环境明暗一样)

由于这2个方面原因,如果没有ISP模块,现在无法让我们生成人类预期的图片质量。如下图,是几幅油画,这就是人类期望的调整ISP成像效果的方向。

再来一张Sensor输出的Raw Data的效果,可以看到效果很差(注意是正常室内光线下):

Sensor的问题以及ISP的处理原理

镜头和Sensor的物理缺陷(不完美)导致以下问题,需要ISP模块去补偿

-------------------------------------------------------------------

问题一:Sensor有漏电流。

由于Sensor漏电流存在,刚把镜头放入一个全黑的环境,Sensor输出的原始数据不为0;而我们希望全黑时原始数据为0.

处理模块名称:BLC(BlackLevel Correction)------黑电平校正

处理原理:

我们需要找到一个矫正值,所有像素值都减去这个值,就得到一个矫正成功的结果。一般情况下,sensor的传感器周边,还有一小部分区域是有感光器的,但是没有光透射进来。可以把这部分的传感器的信号作为矫正值,从可感光部分的信号中减去,就可获得校正后信号。

处理流程:

在运行时调整,不需要依赖人工矫正。

处理效果:

处理方案成熟。

左边未校验,右边是矫正后的图像

问题二:通过镜头(lens)到达(cmos/ccd)Sensor中间的光多于到达Sensor的边缘的光,即光学系统中的渐晕。

这是由于随着视场角慢慢增大,能够通过照相机镜头的斜光束将慢慢减少。导致Senor捕获的图像中间亮度高,周围边缘亮度低。

处理模块名称:LSC(Lens Shade Correction)------镜头阴影校正

LSC(Lens Shade Correction)------镜头阴影校正

处理原理:

首先检测出图像中间亮度比较均匀的部分,认为这部分不需要矫正,然后以此为中心,计算出周围区域需要补偿的因子(增益)。实际项目中,可以把镜头对准白色物体,检查图像四周是否有暗角。

处理流程:

在运行前依赖人工矫正。

处理效果:

处理方案成熟。

下图左边图像是未做镜头阴影校正的,右边图像是做了镜头阴影校正的。

问题三:Senor上有的像素点的输出有坏点。

由于Sensor是物理器件,有坏点是难以避免的;而且使用时间长了坏点会越来越多。通过在全黑环境下观察输出的彩点和亮点,或在白色物体下观察输出的彩点和黑点,就可以看到无规律的散落在各处的坏点。

处理模块名称:BPC(Bad Point Correction)------坏点校正

也叫Defect Pixel Correction(DPC)

处理原理:

第一步:检测坏点。在RGB域上做5x5的评估,如果某个点和周围的点偏离度超过阈值的点为坏点。为了防止误判,还需要更复杂的逻辑,如连续评估N帧。

第二步:纠正坏点。对找到的坏点做中值滤波,替换原来的值即可。

处理流程:

在运行时调整,不需要依赖人工矫正。

处理效果:

NA。

问题四:Cmos的Sensor采用了Bayer色彩滤波阵列(Bayer Color Filter Array,CFA)。

按道理sensor输出的是RGB的raw data,每个像素点都感知RGB 3个分量的数字这样最准确。但是这样需要3套感光板,而且RGB的3套数据还需要时间同步和对齐,这样成本高,难度大。

所以,我们通常采用一个叫Bayer色彩滤波阵列(Bayer Color Filter Array,CFA)的滤光板,放在一个感光板。

如下图是一个8x8的分辨率的感光面板,图(a)中彩色部分是Bayer色彩滤波阵列,RGB三种颜色间隔排列。这样一次拍照就产生图(b)的RGB三幅图片,图片中彩色的是有感光数字的,白色空白是没有感光数字的点。我们需要通过Demosaic(颜色插值)的方法,把白色的像素点的值给补上。

图(b)绿色的像素点数目是红色或蓝色的2倍,是因为人员对绿色更敏感。

Bayer色彩滤波阵列的结构:(a)在Sensor表面的CFA; (b)颜色分量的光分离和导致的传感器的不同像素点

注:Bayer色彩滤波阵列并不是唯一选择,他只是柯达公司科学家Bayer发明的。华为P30pro夜间拍摄牛逼,用到了RYYB的滤镜阵列设计,RYYB就是将两个绿色像素(G)换成黄色像素(Y)替代, Y(红色和绿色组合)。

处理模块名称:Demosaic------颜色插值

Demosaic------颜色插值

处理原理:

在补充图(b)中白色像素点的数值时,我们可以认为每个白色像素点的值,和他附近的同色点的值相近。所以,最简单的方法是内插法。

处理流程:

在运行时调整,不需要依赖人工矫正

处理效果:

较成熟。

问题五:Senor获取的图像中有大量噪声。

Senor的感光器件包含模拟部分,所以信号中的噪声很难避免,ADC器件本身也会引入噪声。另外,当光线较暗时,整个系统需要将信号放大,这样噪声也跟着放大。

我们在看没有经过降噪处理的图片时,会感觉到图片上浮了一层彩色雪花点。

处理模块名称:Bayer Denoise-----去除噪声

Bayer Denoise-----去除噪声

处理原理:

对图像进行降噪处理的传统方法有均值滤波、高斯滤波,本质是低通滤波器。

普通的高斯滤波只考虑像素的空间距离关系,这样会导致滤波后图像变得模糊,为了避免图像变模糊,就需要保持图像的边缘,这时,就还要考虑相邻像素和本像素的相似程度,对于相似度高的像素给予更高的权重,我们称这种滤波为双边滤波。

处理流程:

部分参数可提前调校(tuning),如调整滤波强弱。

处理效果:

比较成熟。

下面左边是滤波前的图像,右边是滤波后的图像。

问题六:Senor获取的图像容易受到光源颜色的影响。

人类的视觉系统有一定的颜色恒常性特点,不会受到光源颜色的影响。实际生活中,不论是晴天、阴天、室内白炽灯或日光灯下,人们所看到的白色物体总是是白色的,这就是视觉修正的结果。人脑对物体的颜色有一定先验知识,可识别物体并且更正这种色差。

但是Sensor不具备这样的特点,比如一张白纸,在不同光线下,Sensor输出的是不同颜色,在低色温下偏黄,在高色温下偏蓝。如白炽灯照明下拍出的照片易偏黄;而在户外日光充足则拍摄出来景物也会偏蓝。

我们就需要,让不同色温光线条件下白色物体,Sensor的输出都转换为更接近白色。

处理模块名称:AWB(Automatic White Balance)------自动白平衡

AWB(Automatic White Balance)------自动白平衡

处理原理:

比较常用的WEB算法有灰度世界、完美反射法等。

灰度世界(Gray World)算法基于一个假设:平均来讲,世界是灰色的。所以,白平衡就是调整R/B增益,达到R、G、B 相等。

白平衡有3个步骤:

(1)检测色温,如果手工调节,就知道图像中什么位置是白色物体了,色温容易检测;如果是自动调节,就需要估计出(猜出)图像中的白色位置,这是最重要的一环;

实际计算中为了实时操作,减少计算量,通常选取某个特定区域(如图像中央)像素进行计算。但若图像颜色较为单一或选定区域正好落入大的色块(红光下的白墙),以上算法求得的色温会非常不准确。为此,必须根据一定的约束条件,挑选出白色像素来计算色差。

(2)计算增益,计算R和B要调整的增益;调整增益将Cb和Cr调整到0 (或接近0)的两个系数,即R=G=B。

(2)色温矫正,根据增益调整整幅图片的色温。

处理流程:

自动校正。

处理效果:

现阶段大多数的数码相机、拍照手机的白平衡的功能都已相当准确。

白平衡对色彩效果影响很大,一个好的算法能够使色彩效果更逼真,也可以利用白平衡达到艺术效果。

问题七:Senor滤光板处各颜色块之间的颜色渗透带来的颜色误差。

所以,Sensor图像传感器获取的图像,于人们期望的颜色有距离,必须矫正。

AWB已经将白色校准了,CCM就是用来校准除白色以外其他颜色的准确度的,

处理模块名称:CCM(Color Correction Matrix)------颜色校正

CCM(Color Correction Matrix)------颜色校正

处理原理:

一般颜色校正的过程是首先利用该图像传感器拍摄到的图像与标准图像相比较,以此来计算得到一个校正矩阵,一般情况下,对颜色进行校正的过程,都会伴随有对颜色饱和度的调整。颜色的饱和度是指色彩的纯度,某色彩的纯度越高,则其表现的就越鲜明;纯度越低,表现的则比较黯淡。

用一个3X3的CCM矩阵来校准, 其中每一列系数r1+g1+b1等于一个恒定值1。Ccm矫正最终结果可以通过拍摄24色卡图片然后用imatest(一款专业的图像分析软件,具有强大的图像分析和处理功能)分析来做分析参考

处理流程:

依赖手工校正。

处理效果:

大家可以看到,右侧的24色卡图片是经过颜色校正的,色彩艳丽了很多。

问题八:人眼对暗部细节比Sensor敏感。

人眼不同于摄像机,接收光子来感知光线。比如:在一间小黑屋中每增加一盏灯,摄像机都能线性增加亮度。但是人眼在黑暗时增加一盏灯时感受明显,往后随着灯的个数增长人眼并不会有明显感受。如果将实验做成图表,如下图所示,蓝色为人眼,紫色为摄像机。

处理模块名称:RGB Gamma------Gamma(伽马)校正

RGB Gamma------Gamma校正

处理原理:

Gamma编码后的图像相比于线性编码的图像,明显有更多的暗部色阶。Gamma编码刚好满足了人眼对暗部细节敏感的特性。即人眼是按照gamma < 1的曲线对输入图像进行处理的(公式f(I)=I^gamma,I为原图像素值)。

现在常用的伽马校正是利用查表法来实现的,即首先根据一个伽马值,将不同亮度范围的理想输出值在查找表中设定好,在处理图像的时候,只需要根据输入的亮度,既可以得到其理想的输出值。

处理流程:

可手工校正Gamma参数。

处理效果:

左图为原图,中图为gamma = 1/2.2在校正结果,右图为gamma = 2.2的校正结果。

问题九:Senor的输出的Raw data是RGB,但是有的处理在YUV上更方便,且YUV存储和传输时更省带宽。

在YUV 色彩空间上进行彩色噪声去除、 边缘增强等更方便。

处理模块名称:RGBToYUV------色彩空间转换

RGBToYUV------色彩空间转换

处理原理:

第一 YUV 是一种基本色彩空间

人眼对亮度Y改变的敏感性远比对色彩变化大很多, 因此, 对于人眼而言, 亮度分量Y 要比色度分量U、V 重要得多。所以,只有YUV444格式的YUV数据的比例是1:1:1,其他各种格式,如YUV422,YUV420等格式,UV的数据量都小于Y,达到节省存储空间和传输带宽的目的。YUV数据的概念就是这样简单。(在编程时查一下文档,再搞清楚内存排布即可)

第二 RGB和YUV转换有固定的公式。

另外,  在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

处理流程:

实时计算,不需要提前调校。

处理效果:

人眼看不出图像质量变化。

问题十:Senor一定曝光量下较暗部分或较亮部分的细节显示不充分。

自然界的中光强度很宽,而人眼对高亮,极暗环境的细节分辨能力相对较窄,而摄像头记录的范围更窄,真正的HDR技术就是记录视觉范围内高亮,极暗环境的中的细节分辨率。

为保证人眼看到的世界和显示器或者摄像头采集的图像的亮度范围相差无几,甚至更好,需要通过tone mapping,将暗处和亮出细节再现。这是一种纯粹为了视觉感受而进行的处理,并非真正的HDR。也有人称为WDR(Wide Dynamic Range)。

简而言之,宽动态技术可以使场景中特别亮的区域和特别暗的区域在最终成像中同时看清楚。

处理模块名称:HDR(High-Dynamic Range)------高动态范围

HDR(High-Dynamic Range)------高动态范围

处理原理:

主要是通过tone mapping的方法,将像素值在特别暗的区域拉高,在特别亮的区域拉低。

Tone mapping有以下几种:

1) global tone mapping

    (a) 单一tone mapping曲线。对整幅图低拉高,高拉低。(缺点,蒙上一层雾感觉,因为数值压缩后忘中间靠拢,局部对比度下降)

    (b) 双边滤波tone mapping。在图像中局部边缘处不会进行tone mapping,以保持局部细节。

2) local tone mapping

    (a) 虚拟曝光。通过多帧相加确定哪些区域是高亮区,哪些区域是低亮区。然后分区进行local tone mapping

    (b) local gamma。图片分成多块,对每块进行gamma矫正。主要根据每块的亮度直方图进行动态调整gamma曲线。

处理流程:实时计算,且需要提前调校。

处理效果:HDR或WDR仍然是手机相机重点竞争的领域,说明这个方向有长足进度,但仍然有提升空间,而且是难点。

问题十一:YUV色彩空间需要进一步降噪和锐化。

主要是对yuv降噪处理,同时为了消除降噪过程中对图像细节的损失,需要对图像进行锐化处理,还原图像的相关细节。

因为在YUV色彩空间,这些处理更方便。

处理模块名称:Color denoise / sharpness

Color denoise / sharpness

处理原理:

为了抑制图像的彩色噪声, 一般采用低通滤波器进行处理。例如使用M×N的高斯低通滤波器在色度通道上进行处理。

在YUV 色彩空间上彩噪去除与边缘加强、色彩与对比度加强,中间还要进行自动曝光控制等, 然后输出YUV(或者RGB) 格式的数据, 再通过I/O 接口传输到CPU 中处理

处理流程:

实时计算,且需要提前调校。

处理效果:

降噪的要求和效果总是不断提高的,而且降噪和锐化是互相矛盾的,所以会有各种不同算法。

如下图所示,左图是未锐化的原始图像,右图是经过锐化之后的图像。

问题十二:图像传感器和镜头需要ISP模块根据光强度自动调节曝光时间。

不同场景下,光照的强度有着很大的差别。人眼有着自适应的能力因此可以很快的调整,使自己可以感应到合适的亮度。而图像传感器却不具有这种自适应能力,因此必须使用自动曝光功能来确保拍摄的照片获得准确的曝光从而具有合适的亮度。

处理模块名称:AEC(Automatic Exposure Control)----自动曝光

AEC(Automatic Exposure Control)----自动曝光

处理原理:

自动曝光的实现一般包括三个步骤:

1)光强测量

光强测量的过程是利用图像的曝光信息来获得当前光照信息的过程。可以统计图像的全部像素,也可以统计图像中间部分、也可以将图像分成不同部分且每部分赋予不同权重。

2)场景分析

场景分析是指为了获得当前光照的特殊情况而进行的处理,比如有没有背光照射或者正面强光等场景下。对这些信息的分析,可以提升图像传感器的易用性,并且能大幅度提高图像的质量,这是自动曝光中最为关键的技术。目前常用的场景分析的技术主要有模糊逻辑和人工神经网络算法。这些算法比起固定分区测光算法具有更高的可靠性,主要是因为在模糊规则制定或者神经网络的训练过程中已经考虑了各种不同光照条件。

3)曝光补偿

在完成了光强测量和场景分析之后,就要控制相应的参数使得曝光调节生效。主要是通过设定曝光时间和曝光增益来实现的。

处理流程:

实时计算,且需要提前调校。

处理效果:

自动曝光的要求总是不断提高的

问题十三:变焦镜头需要自动调节焦距。

处理模块名称:AF自动对焦

AF自动对焦

处理原理:

AF算法的基本步骤是先判断图像的模糊程度,通过合适的模糊度评价函数求得采集的每一副图像的评价值, 然后通过搜索算法得到一系列评价值的峰值, 最后通过电机驱动将采集设备调节到峰值所在的位置, 得到最清晰的图像。

对焦评价函数

评价函数有很多种, 主要考虑的图像因素有图像频率(清晰的图像纹理多, 高频分布较多), 还有图像的灰度分量的分布(图像对应的灰度图的分量分布范围越大,说明图像的细节较多, 反应的图像的清晰程度)

常用的搜索算法有爬山算法, 搜索窗口有黄金分割点对焦嵌套窗口等.

处理流程:

实时计算,且需要提前调校。

处理效果:

大家体验一下自己的手机摄像头的对焦体验,大部分时间是准的。

总结,如何才能做一个能商用有竞争力的ISP

通过上面的介绍,大家在看cmos传感器的ISP处理流程图,是不是就豁然开朗了?

ISP的原理如此简单,那为什么成为图像处理芯片的差异化的最大壁垒之一呢?

第一,上面介绍的ISP的功能,原理虽然简单,但是里面有太多需要估计的策略,其实就是猜,要猜准确,有大量的经验,反复的调校工作在里面。

第二,上面有些模块是相互影响的,这也增加了工作量。调试时,可能按下葫芦浮起瓢,大量时间消耗。比如,我们常说的3A算法(Auto Exposure、Auto Focus和Auto white balance)上文都介绍过,之所以叫3A,就是因为他们是相互作用相互成全的。

第三,作为一个商用的ISP,还需要更多的功能模块。如下图中,还需要有X-talk(串扰),VSM(Video Stablization Measurement)视频稳定。

下面的名词的概念上文中都提到了:

    DPCC(Defect Pixel Cluster Correction)坏点簇纠正

    DPF(De-noising Pre-Filter)降噪预滤波

    蓝框框里是“去马赛克”单元,包含CAC(Cromatic Aberration Correction色彩失常校正)、降噪滤波器

    CNR(Croma Noise Reduction)色度噪点降低

    CSM(Color Space Matrix)

最后,是人才问题,ISP是苦活累活,人才会被吸引到更加多金、就业面更广的AI上去;作为历史较悠久的技术,员工花了大量时间,就业去向只有较大的几家芯片公司,这些公司可能已经不怎么招新人了。所以,一家公司要建立自己的ISP团队,考验的是公司的技术积累、公司对ISP的政策倾斜。

推荐阅读:

关于我

独家 | Android Camera 面试流程、经验分享

一篇文章带你了解Android 最新Camera框架

深圳上班,

从事Android Camera相关软件开发工作,

公众号记录生活和工作的点滴,

欢迎加入“小驰成长圈”,期待和你相遇~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/755937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电能管理系统在路店上的应用 安科瑞 许敏

摘要&#xff1a;随着企业改革的不断深入&#xff0c;对现代化用电管理的水平要求越来越高&#xff0c;准确、快速、经济的获得用电回路的各类数据进行用电分析、负荷管理、表计运行状况监测、电费自动结算的基础。同时也是提高企业经济效益的有效手段。近年来技术人员对监控系…

嵌入式程序开发者的数量剧增

随着物联网、智能设备和嵌入式系统的快速发展&#xff0c;嵌入式程序开发领域的需求不断增长&#xff0c;因此嵌入式程序开发者的数量也在剧增。这种趋势在过去几年中已经变得非常明显。 以下是导致嵌入式程序开发者数量剧增的一些主要原因&#xff1a; 我这里刚好有嵌入式、单…

Mac平台下如何制作pkg安装包以及rpath设置

打包工具介绍 Mac平台规范包可以使用Packages工具。下载地址 打包前准备工作 创建一个目录 macProject macProject目录中是以下目录结构 myProject.app└── Contents├── Info.plist├── MacOS├── res├── libmymath.dylib├── Frameworks└── Resources├…

Hive多行转多列,多列转多行

hive中的行列转换包含单行、多行、单列、多列&#xff0c;所以一共有四种组和转换结果。 一、多行转多列 原始数据表 目标结果表 分析&#xff1a;目标表中的a和b是用分组形成&#xff0c;所以groupby字段选用原始表中col1&#xff0c;c、d、e是原始表中的行值&#xff0c;…

数据结构(王道)——线性表的存储结构之循环表

一、循环单链表 定义&#xff1a; 循环单链表代码实现 创建并初始化、判断循环单链表是否为空、判断结点p是否为循环单链表的表尾结点的代码操作。 二、循环双链表 定义&#xff1a; 循环双链表代码实现 创建并初始化、判断循环双链表是否为空、判断结点p是否为循环双链表的…

橙河网络:怎么搭建海外问卷网站呢?

大家好&#xff0c;我是橙河&#xff0c;如果你想要搭建海外问卷网站赚钱&#xff0c;看我这篇文章就行了。 搭建网站&#xff0c;本身并不复杂&#xff0c;自己会敲代码就自己搞&#xff0c;不会就花点钱外包给别人。 搭建好问卷网站以后&#xff0c;重点来了&#xff0c;你需…

Learning Spatial and Spatio-Temporal Pixel

Learning Deformable Kernels for Image and Video Denoising 作者&#xff1a; Xiangyu Xu 商汤科技SenseTime Research 论文思想&#xff1a;一是将传统的双边滤波算法与CNN结合起来&#xff0c;二是用变形卷积来做多帧对齐的问题&#xff0c;三还是在raw上进行处理的。 …

WSL2 忘记用户密码

步骤一&#xff1a;将默认用户切换为root 在Windows里启动命令提示符&#xff0c;输入&#xff1a; ubuntu2004 config --default-user root这就已经将我的ubuntu20.04的默认用户切换为了root&#xff0c; 不同的WSL版本可能命令的第一个符号不一样&#xff0c;区别如下图&am…

Acrel-3000电能管理系统某公司项目中的应用 安科瑞 许敏

摘要&#xff1a;用户对自身用能的管理意识提升&#xff0c;促使用户侧电力配电系统在商业、工业以及民用区域的普及。系统针对用户侧主要的用能节点&#xff0c;设计安装智能仪表&#xff0c;再通过后台系统来实时监控各用能回路的工作状态、用电量、用水量、用气量数数据的采…

自动驾驶商用驶入“快车道”,汽车软件厂商如何“抢市”?

L3级及以上自动驾驶的商业化进程正在驶入“快车道”。 一方面&#xff0c;高阶自动驾驶的相关法规及标准不断出台&#xff0c;为自动驾驶行业的发展注入了“强心剂”。 比如工业和信息化部副部长辛国斌就曾表示&#xff0c;将启动智能网联汽车准入和上路通行试点&#xff0c;…

【嵌入式开发 Linux 常用命令系列 5 -- history 与 “!“ 巧妙配合】

文章目录 history 命令介绍history 命令与 “&#xff01;”运行先前执行的命令先前命令的参数传递给新命令两个或多个参数的处理设置 history 命令显示行数以及时间 上篇文章&#xff1a;嵌入式开发 Linux 常用命令系列 4 – git 常用配置及常用命令 history 命令介绍 histo…

虚拟内存、内存分页、分段、段页式内存管理

虚拟内存 为什么有虚拟内存&#xff1f; CPU是直接操作内存的物理地址。在这种情况下&#xff0c;如果两个程序占用的内存有重叠&#xff0c;要想同时运行两个程序是不可能的。 为啥它会内存有重叠啊&#xff1f;我不理解。难道不是这块内存被这个程序使用之后另外的程序就无…

Java内部类(InnerClass)

文章目录 概述1 什么是内部类2 为什么要声明内部类呢3 内部类的分类 成员内部类1 概述2 创建成员内部类对象 局部内部类1 非匿名局部内部类 匿名内部类 概述 1 什么是内部类 将一个类A定义在另一个类B里面&#xff0c;里面的那个类A就称为内部类&#xff08;InnerClass&#…

React中使用Redux

1.为什么要使用redux redux是一个专门用于状态管理的一个库&#xff0c;和vue中的vuex功能类似。其中核心点就是状态的管理。虽然我们无论在vue还是在react中我们组件间的通行都可以使用消息总线或者父子组件间的消息传递来进行操作。但是如果我们需要A组件的状态在其他十个或者…

Python开发项目基于卷积神经网络的车牌识别仿真软件

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

MongoDB初体验-安装使用教程2023.7

前言&#xff1a;博主第一次接触MongoDB&#xff0c;看了一圈网上现有的教程&#xff0c;不是缺少细节就是有问题没交代清楚&#xff0c;特整理了一下自己安装运行的过程&#xff0c;从下载安装到开机自启&#xff0c;全程细节齐全、图文并茂、简单易懂。 目录 1. 从官网下载2…

1-4 架构师所需要具备的技术栈与能力

架构师所需要具备的技术栈与能力 全局图解 全局图解

JavaWeb(4)——HTML、CSS、JS 快速入门

一、JavaScript 数组 数组筛选&#xff08;查找&#xff0c;将原来数组中的某些数据去除&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

2023年中国传媒大学程序设计大赛(同步赛)F.舞台矩形

一个简单的线段树维护最值&#xff0c;容易犯错的地方在于y相等的时候不应该省略 这个地方调了一会发现自己傻了 #include<bits/stdc.h> #define ls u<<1 #define rs u<<1|1 using namespace std; const int N 1e510; typedef long long ll; const ll INF …

DAPP(七)——React与智能合约的架构整合

合并一下react和智能合约&#xff0c;创建react脚手架 create-react-app myapp 将合约中对应的文件 复制到 react脚手架的根目录中 结果如下&#xff1a; 下载合约所要的依赖&#xff1a; npm i openzeppelin-solidity 可以在脚手架终端执行truffle的命令语句&#xff0c;t…