精华内容
下载资源
问答
  • matlab人脸识别论文

    万次阅读 多人点赞 2019-10-11 17:41:51
    人脸识别是模式识别研究的一个热点,它在身份鉴别、信用识别,护照的核对及监控系统等方面有着I泛的应用。人脸图像由于受光照、表情以及姿态等因索的影响,使得同一个人的脸像矩阵差异也比较大。因此,进行人脸...

    摘 要

     本文设计了一种基于BP神经网络的人脸识别系统,并对其进行了性能分析。该系统首先利用离散小波变换获取包含人脸图像大部分原始信息的低频分量,对图像数据进行降维;再由PCA算法对人脸图像进行主成分特征提取,进--步降低图像数据的处理量;最后使用经过训练后的BP神经网络对待测人脸进行分类识别。详细介绍了离散小波变换PCA特征提取以及BP神经网络分类设计。通过系统仿真实验与分析发现:人脸特征的提取是该系统的关键;同时,由于人脸灰度信息的统计特征与有监督训练BP神经网络分类器,使该系统只在固定类别,并且光照均匀的人脸识别应用场景中具有较高的识别准确率。因此,很难在复杂环境中应用。
    

    关键词:人脸识别;人工神经网络;离散小波变换; PCA; BP神经网络
    Abstract
    In this paper, a face recognition system based on BP neural network is designed and its performance is analyzed. The system first uses discrete wavelet transform to obtain the low-frequency components which contain most of the original information of the face image, and then uses PCA algorithm to extract the principal component features of the face image, progressively reducing the processing capacity of the image data. Finally, the trained BP neural network is used to classify and recognize the tested face. Discrete wavelet transform PCA feature extraction and BP neural network classification design are introduced in detail. Through the system simulation experiment and analysis, it is found that the extraction of facial features is the key of the system. At the same time, because of the statistical features of gray information and the supervised training of BP neural network classifier, the system only has a high recognition accuracy in fixed categories and uniform illumination of face recognition application scenarios. Therefore, it is difficult to apply in complex environment.

    Key words: face recognition; artificial neural network; discrete wavelet transform; PCA; BP neural network
    1绪论

      人脸识别是模式识别研究的一个热点,它在身份鉴别、信用卡识别,护照的核对及监控系统等方面有着I泛的应用。人脸图像由于受光照、表情以及姿态等因索的影响,使得同一个人的脸像矩阵差异也比较大。因此,进行人脸识别时,所选取的特征必须对上述因素具备-一定的稳定性和不变性。主元分析(PCA)方法是一种有效的特征提取方法,将人脸图像表示成一一个列向量,经过PCA变换后,不仅可以有效地降低其维数,同时又能保留所需要的识别信息,这些信息对光照、表情以及姿态具有一定的不敏感性。 在获得有效的特征向量后,关键问题是设计具有良好分类能力和鲁棒性的分类器、支持向量机(SVI )模式识别方法,兼顾调练误差和泛化能力,在解决小样本、非线性及高维模式识别问题中表现出许多特有的优势。
    

    1.1人脸识别技术的细节

    一般来说,人脸识别系统包括图像提取、人脸定位、图形预处理、以及人脸识别(身份确认或者身份查找)。系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸图像或者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。
    1.2人脸识别技术的广泛应用

    一项技术的问世和发展与人类的迫切需求是密切相关的,快速发展的社会经济和科学技术使得人类对安全(包括人身安全、隐私保护等)得认识越来越重视。人脸识别得一个重要应用就是人类的身份识别。一-般来说, 人类得身份识别方式分为三类:
    1.特征物品,包括各种证件和凭证,如身份证、驾驶证、房门钥匙、印章等;
    2.特殊知识,包括各种密码、口令和暗号等;

    3.人类生物特征,包括各种人类得生理和行为特征,如人脸、指纹、手形、掌纹、虹膜. DNA、签名、语音等。前两类识别方式属于传统的身份识别技术,其特点是方便、快捷,但致命的缺点是安全性差、易伪造、易窃取。特殊物品可能会丢失、偷盗和复制,特殊知识可以被遗忘、混淆和泄漏。相比较而言,由于生物特征使人的内在属性,具有很强的自身稳定性和个体差异性,因此生物特征是身份识别的最理想依据。基于以上相对独特的生物特征,结合计算机技术,发展了众多的基于人类生物特征的身份识别技术,如DNA识别技术、指纹识别技术、虹膜识别技术、语音识别技术和人脸识别技术等。生物识别技术在上个世纪已经有了- -定得发展,其中指纹识别技术已经趋近成熟,但人脸识别技术的研究还处于起步阶段。指纹、虹膜、掌纹等识别技术都需要被识别者的配合,有的识别技术还需要添置复杂昂贵的设备。人脸识别可以利用已有的照片或是摄像头远距离捕捉图像,无需特殊的采集设备,系统的成本低。并且自动人脸识别可以在当事人毫无觉察的情况下完成身份确认识别工作,这对反恐怖活动有非常重要的意义。基于人脸识别技术具有如此多的优势,因此它的应用前最非常广阔,已成为最具潜力的生物特征识别技术之一
    1.3人脸识别技术的难点

      虽然人类可以毫不困难地根据人脸来辨别一个人,但是利用计算机进行完全自动的人脸识别仍然有许多困难。人脸模式差异性使得人脸识别成为-个非常困难的问题,表现在以下方面:
    
      1.人脸表情复杂,人脸具有多样的变化能力,人的脸上分布着Ii十多块面部肌肉,这些肌肉的运动导致不同面部表情的出现,会造成人脸特征的显著改变。
    
      2.随着年龄而改变,随着年龄的增长,皱纹的出现和面部肌肉的松驰使得人脸的结构和纹理都将发生改变。
    
      3.人脸有易变化的附加物,例如改变发型,留胡须,戴帽子或眼镜等饰物。4.人脸特征遮掩,人脸全部、部分遮掩将会造成错误识别。
    
      5.人脸图像的畸变,由于光照、视角、摄取角度不同,可能造成图像的灰度。
    

    1.4国内外研究状况

    人脸识别是人类视觉最杰出的能力之-。 它的研究涉及模式识别、图像处理、生物学、心理学、认知科学,与基于其它生物特征的身份鉴别方法以及计算机人机感知交互领域都有密切联系。人脸识别早在六七十年代就引起了研究者的强烈兴趣。20世纪60年代,Bledsoe 提出了人脸识别的半自动系统模式与特征提取方法。70年代,美、英等发达国家开始重视人脸识别的研究工作并取得进展。1972 年,Harmon 用交互人脸识别方法在理论上与实践上进行了详细的论述。同年,Sakai 设计了人脸图像自动识别系统。80年代初
    T. Minami 研究出了优于Sakai的人脸图像自动识别系统。但早期的人脸识别一般都需要人的某些先验知识,无法摆脱人的干预。进入九十年代,由于各方面对人脸识别系统的迫切需求,人臉识别的研究变的非常热门。人脸识别的方法有了重大突破,进入了真正的机器自动识别阶段,如Kartbunen-Loeve变换等或新的神经网络技术。人脸识别研究

    得到了前所未有的重视,国际上发表有关人脸识别等方面的论文数量大幅度增加,仅从1990年到2000年之间,sCl 及EI可检索到的相关文献多达数千篇,这期间关于人脸识别的综述也屡屡可见。国外有许多学校在研究人脸识别技术,研究涉及的领域很广。这些研究受到军方、警方及大公司的高度重视和资助,国内的一些知名院校也开始从事人脸识别的研究。

      人脸识别是当前模式识别领域的一个前沿课题,但目前人脸识别尚处于研究课题阶段,尚不是实用化领域的活跃课题。虽然人类可以毫不困难地由人脸辨别一个人,但利用计算机进行完全自动的人脸识别存在许多困难,其表现在:人脸是非刚体,存在表情变化:人脸随年龄增长面变化:发型、眼镜等装饰对人脸造成遮挡:人脸所成图像受光照、成像角度、成像距离等影响。人脸识别的困难还在于图像包括大量的数据,输入的像素可能成百上千,每个像素都含有各自不同的灰度级,由此带来的计算的复杂度将会增加。现有的识别方法中,通过从人脸图像中提取出特征信息,来对数据库进行检索的方法速度快,而利用拓扑属性图匹配来确定匹配度的方法则相对较快。
    

    1.5人脸识别的研究内容

    人脸识别技术(AFR)就是利用计算机技术,根据数据库的人脸图像,分析提取出有效的识别信息,用来“辨认”身份的技术。人脸识别技术的研究始于六十年代末七十年代初,其研究领城涉及图像处理、计算机视觉、模式识别、计算机智能等领城,是伴随着现代化计算机技术、数据库技术发展起来的综合交叉学科。
    1.5.1人脸识别研究内容

      人脸识别的研究范围广义上来讲大致包括以下hi个方面的内容。
    
      1.人脸定位和检测(Face Detection) :即从动态的场景与复杂的背景中检测出人臉的存在并且确定其位置,最后分离出来。这一任务主要受到光照、噪声、面部倾斜以及各种各样遮挡的影响。
    
      2.人脸表征(Face Representation) (也称人脸特征提取) :即采用某种表示方法来表示检测出人脸与数据库中的已知人脸。通常的表示方法包括几何特征(如欧氏距离、曲率、角度)、代数特征(如矩阵特征向量)、固定特征模板等。
    
      3.人脸识别(Face Recogni tion) :即将待识别的人脸与数据库中已知人脸比较,得出相关信息。这一过程的核心是选择适当的人脸表征方法与匹配策略。
    
      4.表情姿态分析(Expression/Gesture Analysis) :即对待识别人脸的表情或姿态信息进行分析,并对其加以归类。
    
    
      5.生理分类(Physical Classi fication) :即对待识别人脸的生理特征进行分析,得出其年龄、性别等相关信息,或者从几幅相关的图像推导出希望得到的人脸图像,如从父母图像推导出孩子脸部图像和基于年龄增长的人脸图像估算等。
    
      人臉识别的研究内容,从生物特征技术的应用前景来分类,包括以下两个方面:人脸验证与人脸识别。
    
      1.人脸验证((Face Veri ficat ion/Authenticat ion):即是回答“是不是某人?"的问题.它是给定一幅待识别人脸图像,判断它是否是某人的问题,属于一对一的两类模式分类问题,主要用于安全系统的身份验证。
    
      2.人脸识别(Face 。Recognition) :即是回答“是谁”的问题。它是给定-幅待识别人脸图像,再已有的人脸数据库中,判断它的身份的问题。它是个“-对多”的多类模式分类问题,通常所说的人脸识别即指此类问题,这也是本文的主要研究内容。
    

    1.5.2人脸识别系统的组成

      在人脸识别技术发展的几十年中,研究者们提出了多种多样的人脸识别方法,但大部分的人脸识别系统主要由三部分组成:图像预处理、特征提取和人脸的分类识别。一个完整的自动人脸识别系统还包括人脸检测定位和数据库的组织等模块,如图1.1.其中人脸检测和人脸识别是整个自动人脸识别系统中非常重要的两个环节,并且相对独立。下面分别介绍这两个环节。
    

    人脸检测与定位,检测图像中是否由人脸,若有,将其从背景中分割出来,并确定其在图
    像中的位置。在某些可以控制拍摄条件的场合,如警察拍罪犯照片时将人脸限定在标尺内,此时人脸的定位很简单。证件照背景简单,定位比较容易。在另一些情况下,人脸在图像
    中的位置预先是未知的,比如在复杂背景下拍摄的照片,这时人脸的检测与定位将受以下因素的影响: :

      1.人脸在图像中的位置、角度、不固定尺寸以及光照的影响:
    
      2.发型、眼睛、胡须以及人脸的表情变化等,3.图像中的噪声等。
    
      特征提取与人脸识别,特征提取之前一般都要敌几何归一化和灰度归一化的工作。前者指根据人脸定位结果将图像中的人脸变化到同一位置和大小:后者是指对图像进行光照补偿等处理,以克服光照变化的影响,光照补偿能够一定程度的克服光照变化的影响而提高识别率。提取出待识别的人脸特征之后,即进行特征匹配。这个过程是一对多或者一对一的匹配过程,前者是确定输入图像为图象库中的哪一个人(即人脸识别),后者是验证输入图像的人的身份是否属实(人脸验证).  
    

    以上两个环节的独立性很强。在许多特定场合下人脸的检测与定位相对比较容易,因此“特征提取与人脸识别环节”得到了更广泛和深入的研究。近几年随着人们越来越关心各种复杂的情形下的人臉自动识别系统以及多功能感知研究的兴起,人脸检测与定位才作为一个独立的模式识别问题得到了较多的重视。本文主要研究人脸的特征提取与分类识别的问题。

    2基于bp神经网络的人脸识别算法

      虽然人脸识别方法的分类标准可能有所不同,但是8前的研究主要有两个方向,一类是从人脸图像整体(Holistic Approaches)出发,基于图像的总体信息进行分类识别,他重点考虑了模式的整体属性,其中较为著名的方法有:人工神经网络的方法、统计模式的方法等。另一类是基于提取人脸图像的几何特征参数(Feature-Based Approaches), 例如眼、嘴和鼻子的特征,再按照某种距离准则进行分类识别。这种方法非常有效,因为人脸不是刚体,有着复杂的表情,对其严格进行特征匹配会出现困难。面分别介绍- -些常 用的方法,前两种方法属于从图像的整体方面进行研究,后三种方法主要从提取图像的局部特征讲行研究。
    
    
      2.1基于特征脸的方法
    

    特征脸方法(cigenface)是从生元分析方法PCA c Principal ComponentAnalysis 导出的一种人脸分析识别方法,它根据一-组人脸图像构造主元子空间,由于主元具有人脸的形状也称作特征脸。识别时将测试图像投影到主元子空间上得到了-组投影系数,然后和各个已知人的人脸图像进行比较识别,取得了很好的识别效果。在此基础上出现了很多特征脸的改进算法。

      特征脸方法原理简单、易于实现,它把人脸作为一个整体来处理,大大降低了识别复杂度。但是特征脸方法忽视了人脸的个性差异,存在着一定的理论缺陷。研究表明:特征脸方法随光线角度及人脸尺寸的影响,识别率会有所下降。
    

    2.2基于bp神经网络的方法

    一、实验要求采用三层前馈BP神经网络实现标准人脸YALE数据库的识别,编程语言为C系列语言。
    二、BP神经网络的结构和学习算法实验中建议采用如下最简单的三层BP神经网络,输入层为,有n个神经元节点,输出层具有m个神经元,网络输出为,隐含层具有k个神经元,采用BP学习算法训练神经网络。BP神经网络的结构BP网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对BP网络加以训练,网络就具有输入输出对之间的映射能力。BP网络执行的是有教师训练,其样本集是由形如(输入向量,期望输出向量)的向量对构成的。在开始训练前,所有的权值和阈值都应该用一些不同的小随机数进行初始化。BP算法主要包括两个阶段:

    2.2.1向前传播阶段

    ①从样本集中取一个样本(Xp,Yp),将Xp输入网络,其中Xp为输入向量,Yp为期望输出向量。
    ②计算相应的实际输出Op。在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是下列运算:

    (2) 向后传播阶段
    ①计算实际输出Op与相应的理想输出Yp的差;
    ②按极小化误差的方法调整权矩阵。这两个阶段的工作一般应受到精度要求的控制

    (1)作为网络关于第p个样本的误差测度(误差函数)。

    (2)如前所述,之所以将此阶段称为向后传播阶段,是对应于输入信号的正常传播而言的,也称之为误差传播阶段。为了更清楚地说明本文所使用的BP网络的训练过程,首先假设输入层、中间层和输出层的单元数分别是N、L和M。X=(x0,x1,…,xN-1)是加到网络的输入矢量,H=(h0,h1,…,hL-1)是中间层输出矢量,Y=(y0,y1,…,yM-1)是网络的实际输出矢量,并且用D=(d0,d1,…,dM-1)来表示训练组中各模式的目标输出矢量。输出单元i到隐单元j的权值是Vij,而隐单元j到输出单元k的权值是Wjk。另外用θk和Φj来分别表示输出单元和隐单元的阈值。于是,中间层各单元的输出为:

    (3)而输出层各单元的输出是:

    其中f(*)是激励函数,采用S型函数:

    2.2.2在上述条件下,网络的训练过程如下:

    (1) 选定训练集。由相应的训练策略选择样本图像作为训练集。
    (2) 初始化各权值Vij,Wjk和阈值Φj,θk,将其设置为接近于0的随机值,并初始化精度控制参数ε和学习率α。
    (3) 从训练集中取一个输入向量X加到网络,并给定它的目标输出向量D。
    (4) 利用式(3)计算出一个中间层输出H,再用式(4)计算出网络的实际输出Y。
    (5) 将输出矢量中的元素yk与目标矢量中的元素dk进行比较,计算出M个输出

    误差项:

    对中间层的隐单元也计算出L个误差项:

    (6) 依次计算出各权值和阈值的调整量:

    (8) 当k每经历1至M后,判断指标是否满足精度要求:E≤ε,其中E是总误差函数。

    如果不满足,就返回(3),继续迭代。如果满足,就进入下一步。
    (9) 训练结束,将权值和阈值保存在文件中。这时可以认为各个权值已经达到稳定,分类器形成。再一次进行训练时,直接从文件导出权值和阈值进行训练,不需要进行初始化。

    YALE数据库是由耶鲁大学计算视觉与扼制中心创立,包括15位志愿者,每个人有11张不同姿势、光照和表情的图片,共计165张图片,图片均为80*100像素的BMP格式图像。我们将整个数据库分为两个部分,每个人的前5幅图片作为网络的训练使用,后6副图片作为测试使用。测试样例:

    输入输出:

      神经网络在人脸识别应用中有很长的历史。早期用于人脸识别的神经网络主要是Kohonen自联想映射神经网络,用于人脸的“回忆”。所谓“回忆”是指当输入图像上的人脸受噪声污染严重或部分缺损时,能用Kohonen网络恢复出原来完整的人脸。Intrator 等人用一个无监督/监督混合神经网络进行人脸识别。其输入是原始图像的梯度图像,以此可以去除光照的变化。监督学习目的是寻找类的特征,有监督学习的目的是减少训练样本被错分的比例。这种网络提取的特征明显,识别率高,如果用几个网络同时运算,求其平均,识别效果还会提高。
    
      与其他类型的方法相比,神经网络方法在人脸识别上有其独到的优势,它避免了复:杂的特征提取工作,可以通过学习的过程获得其他方法难以实现的关于人脸识别的规律和规则的隐性表达。此外,神经网络以时示方式处理信息,如果能用硬件实现,就能显著提高速度。神经网络方法除了用于人脸识别外,还适用于性别识别、种族识别等。
    

    2.3弹性图匹配法

    弹性图匹配方法是-种基于动态链接结构DLA C Dynamic Link Architecture的方法。它将人脸用格状的稀疏图表示,图中的节点用图像位置的Gabor小波分解得到的特征向量标记,图的边用连接节点的距离向量标记。匹配时,首先J找与输入图像最相似的模型图,再对图中的每个节点位置进行最佳匹配,这样产生-一个变形图,其节点逼近模型图的对应点的位置。弹性图匹配方法对光照、位移、旋转及尺度变化都敏感。此方法的主要缺点是对每个存储的人臉需计算其模型图,计算量大,存储量大。为此,Wiskott 在原有方法的基础上提出聚東图匹配,部分克服了这些缺点。在聚束图中,所有节点都已经定位在相应目标上。对于大量数据库,这样可以大大减少识别时间。另外,利用聚束图还能够匹配小同人的最相似特征,因此可以获得关于未知人的性别、胡须和眼镜等相关信息。
    2.4基于模板匹配的方法
    模板匹配法是一-种经典的模式识别方法,这种方法大多是用归一一化和互相关,直接计算两副图像之间的匹配程度。由于这种方法要求两副图像上的目标要有相同的尺度、取向和光照条件,所以预处理要做尺度归一化和灰度归一化的工作。最简单的人脸模板是将人脸看成-一个椭圆,检测人臉也就是检测图像中的椭圆。另一种方法是将人脸用一-组独立的小模板表示,如眼睛模板、嘴巴模板、鼻子模板、眉毛模板和下巴模板等。但这些模板的获得必须利用各个特征的轮廓,而传统的基于边缘提取的方法很难获得较高的连续边缘。即使获得了可靠度高的边缘,也很难从中自动提取所需的特征量。模板匹配方法在尺度、光照、旋转角度等各种条件稳定的状态下,它的识别的效果优于其它方法,但它对光照、旋转和表情变化比较敏感,影响了它的直接使用。2.5基于人脸特征的方法人脸由眼睛、鼻子、嘴巴、下巴等部件构成,正因为这些部件的形状、大小和结构上的各种差异才使得世界上每个人脸千差万别,因此对这些部件的形状和结构关系的几何描述,可以作为人脸识别的重要特征。几何特征最早是用于人脸检测轮廓的描述与识别,首先根据检测轮廓曲线确定若干显著点,并由这些显著点导出- -组用于识别的特征度量如距离、角度等。采用儿何特征进行正面人脸识别一般是通过提取人眼、口、鼻等重要特征点的位置和眼睛等重要器官的几何形状作为分类特征。
    定位眼睛往往是提取人脸几何特征的第-步。由于眼睛的对称性以及眼珠呈现为低灰度值的圆形,因此在人脸图像清晰瑞正的时候,眼睛的提取是比较容易的。但是如果人脸图像模糊,或者噪声很多,则往往需要利用更多的信息(如眼睛和眉毛、鼻子的相对位置等),而且.这将使得眼睛的定位变得很复杂。而且实际图像中,部件未必轮廓分明,有时人用眼看也只是个大概,计算机提取就更成问题,因而导致描述同-一个人的不同人脸时,其模型参数可能相差很大,面失去识别意义。尽管如此,在正确提取部件以及表情变化微小的前提下,该方法依然奏效,因此在许多方面仍可应用,如对标准身份证照片的应用。

    2.5九个人脸库介绍

    1. FERET人脸数据库
      http://www.nist.gov/itl/iad/ig/colorferet.cfm
      由FERET项目创建,此图像集包含大量的人脸图像,并且每幅图中均只有一个人脸。该集中,同一个人的照片有不同表情、光照、姿态和年龄的变化。包含1万多张多姿态和光照的人脸图像,是人脸识别领域应用最广泛的人脸数据库之一。其中的多数人是西方人,每个人所包含的人脸图像的变化比较单一。

    2. CMU Multi-PIE人脸数据库
      http://www.flintbox.com/public/project/4742/
      由美国卡耐基梅隆大学建立。所谓“PIE”就是姿态(Pose),光照(Illumination)和表情(Expression)的缩写。CMU Multi-PIE人脸数据库是在CMU-PIE人脸数据库的基础上发展起来的。包含337位志愿者的75000多张多姿态,光照和表情的面部图像。其中的姿态和光照变化图像也是在严格控制的条件下采集的,目前已经逐渐成为人脸识别领域的一个重要的测试集合。

    3. YALE人脸数据库(美国,耶鲁大学)
      http://cvc.cs.yale.edu/cvc/projects/yalefaces/yalefaces.html
      由耶鲁大学计算视觉与控制中心创建,包含15位志愿者的165张图片,包含光照、表情和姿态的变化。
      Yale人脸数据库中一个采集志愿者的10张样本,相比较ORL人脸数据库Yale库中每个对象采集的样本包含更明显的光照、表情和姿态以及遮挡变化。

    4. YALE人脸数据库B
      https://computervisiononline.com/dataset/1105138686
      包含了10个人的5850幅在9种姿态,64种光照条件下的图像。其中的姿态和光照变化的图像都是在严格控制的条件下采集的,主要用于光照和姿态问题的建模与分析。由于采集人数较少,该数据库的进一步应用受到了比较大的限制。

    5. MIT人脸数据库
      由麻省理工大学媒体实验室创建,包含16位志愿者的2592张不同姿态(每人27张照片),光照和大小的面部图像。

    6. ORL人脸数据库
      https://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html
      由英国剑桥大学AT&T实验室创建,包含40人共400张面部图像,部分志愿者的图像包括了姿态,表情和面部饰物的变化。该人脸库在人脸识别研究的早期经常被人们采用,但由于变化模式较少,多数系统的识别率均可以达到90%以上,因此进一步利用的价值已经不大。
      ORL人脸数据库中一个采集对象的全部样本库中每个采集对象包含10幅经过归一化处理的灰度图像,图像尺寸均为92×112,图像背景为黑色。其中采集对象的面部表情和细节均有变化,例如笑与不笑、眼睛睁着或闭着以及戴或不戴眼镜等,不同人脸样本的姿态也有变化,其深度旋转和平面旋转可达20度。

    7. BioID人脸数据库
      https://www.bioid.com/facedb/
      包含在各种光照和复杂背景下的1521张灰度面部图像,眼睛位置已经被手工标注。

    8. UMIST图像集
      由英国曼彻斯特大学建立。包括20个人共564幅图像,每个人具有不同角度、不同姿态的多幅图像。

    9. 年龄识别数据集IMDB-WIKI
      https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/
      包含524230张从IMDB和Wikipedia爬取的名人数据图片。应用了一个新颖的化回归为分类的年龄算法。本质就是在0-100之间的101类分类后,对于得到的分数和0-100相乘,并将最终结果求和,得到最终识别的年龄

    3matlab分析人脸方法介绍
    人脸识别之一:查找图片中的人脸并用方框圈出
    这种类似于智能手机拍照时,屏幕里那个框任务头部的红框。大致步骤为:获取RGB图片—>转换为灰度图像—>图像处理—>人脸识别。代码如下:clear all
    clc

    %获取原始图片
    i=imread(‘face.jpg’);
    I=rgb2gray(i);
    BW=im2bw(I); %利用阈值值变换法将灰度图像转换成二进制图像
    figure(1);
    imshow(BW);
    %最小化背景
    [n1 n2]=size(BW);
    r=floor(n1/10);
    c=floor(n2/10);
    x1=1;x2=r;
    s=r*c;

    for i=1:10
    y1=1;y2=c;
    for j=1:10
    if(y2<=c || y2>=9c) || (x11 || x2r10)
    loc=find(BW(x1:x2,y1:y2)==0);
    [o p]=size(loc);
    pr=o*100/s;
    if pr<=100
    BW(x1:x2,y1:y2)=0;
    r1=x1;r2=x2;s1=y1;s2=y2;
    pr1=0;
    end
    imshow(BW);
    end
    y1=y1+c;
    y2=y2+c;
    end
    x1=x1+r;
    x2=x2+c;
    end
    figure(2)
    subplot(1,2,1);
    imshow(BW)
    title(‘图像处理’);
    %人脸识别
    L=bwlabel(BW,8);
    BB=regionprops(L,‘BoundingBox’);
    BB1=struct2cell(BB);
    BB2=cell2mat(BB1);

    [s1 s2]=size(BB2);
    mx=0;
    for k=3:4:s2-1
    p=BB2(1,k)*BB2(1,k+1);
    if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8
    mx=p;
    j=k;
    end
    end
    subplot(1,2,2);
    title(‘人脸识别’);
    imshow(I);
    hold on;
    rectangle(‘Position’,[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j)],‘EdgeColor’,‘r’)实验效果图:

             从实验效果图中,可以看出红框框出了人脸部分。
    

    人脸识别之二:由输入的人像识别出数据库中人像
    这种情况类似于手机人脸解锁,通过当前的人脸去和保存的人脸做比对来实现解锁等功能;从网上看了好多资料,由于个人能力有限大多都没仿真出来,最后通过学习PCA算法,了解到可通过PCA算法对输入矩阵降维,提取特征值和特征向量的方式来做人脸比对。具体的PCA的东西在这里不作介绍,主要介绍一下如何实现人脸比对。
    大致步骤:制作人脸数据样本—>PCA提取样本数据特征值—>人脸比对1.人脸样本
    从网上搜集了10张人脸图片,来制作成样本。

                         %读取转换10张图片,生成数据矩阵function ImgData = imgdata()  
    

    %导入图片
    picture1 = rgb2gray(imread(‘1.jpg’));
    picture2 = rgb2gray(imread(‘2.jpg’));
    picture3 = rgb2gray(imread(‘3.jpg’));
    picture4 = rgb2gray(imread(‘4.jpg’));
    picture5 = rgb2gray(imread(‘5.jpg’));
    picture6 = rgb2gray(imread(‘6.jpg’));
    picture7 = rgb2gray(imread(‘7.jpg’));
    picture8 = rgb2gray(imread(‘8.jpg’));
    picture9 = rgb2gray(imread(‘9.jpg’));
    picture10 = rgb2gray(imread(‘10.jpg’));
    [m,n] = size(picture1);
    picture_ten = {picture1,picture2,picture3,picture4,picture5,picture6,picture7,picture8,picture9,picture10};
    for i=1:10
    %把mn的矩阵变换成1(mn)的矩阵
    ImgData(i,:) = reshape(picture_ten{i},1,m
    n);
    end
    %数据范围缩小到0到1之间
    ImgData = double(ImgData)/255;

    PCA分析function Cell_ten = PCA(imgdata,k)
    [m,n] = size(imgdata);
    img_mean = mean(imgdata); %计算每列平均值
    img_mean_ten = repmat(img_mean,m,1); %复制m行平均值至矩阵img_mean_ten
    Z = imgdata - img_mean_ten;
    T = Z’Z;%协方差矩阵
    [V,D] = eigs(T,k); %计算T中最大的前k个特征值与特征向量
    img_new = imgdata
    V*D; %低维度下的各个人脸的数据
    Cell_ten = {img_new,V,D};3.通过输入测试人脸从数据库中找到相对应人脸function face= facefind(Cell_ten,testdata)%此函数代码借鉴于他人,还未征求其同意,这里就暂时略过这里testdata是测试图片的数据4.主程序调用img=imgdata(); %图片矩阵数据
    Cell_ten=PCA(img,2);% PCA
    face1=facefind(Cell_ten,imread(‘test.jpg’));%识别
    subplot(1,2,1)
    imshow(‘test.jpg’)
    title(‘测试图像’)
    subplot(1,2,2)
    imshow(strcat(num2str(face1),’.jpg’))
    title(‘数据库图像’)测试效果: 使用这个方式可以实现简单的人脸识别,但精确度不高;

    4 分析算法
    在人脸识别系统中有许多关键环节,其中最重要的莫过于特征提取。利用主成分分析法(PCA)进行特征提取是目前应用最多的提取方法。作为一种科学的统计方法,它在模式识别、信号处理、数字图像处理等等领域都有广泛涉猎。基于PCA中空间原始数据主要特征提取,减少数据冗余的思想,一些在低维特征空间的数据被处理,并合理保留了原始数据中有用的信息,数据空间中维数过高的问题也得以解决。
    4.1  主成分分析的基本原理

    实际上主成分分析就是一种数学降维演算方法,用若干个综合变量来代替原本更多的变量,让这些综合变量尽可能的实现对原有变量信息的取代,并保持彼此之间不存在关联。这种多变量化为少数相互无关的变量且信息量不变的统计分析方法就叫做主成分分析法。
      假设F1表示原变量的首个线性组合所组成的主要成分指标,就有F1=a11X1+a21X2+…ap1Xp。根据这个数学式可知,如果在每一个主成分中提取一个信息量,即可用方差(F1)进行度量,随着方差F1的增大,F1所包含的信息也就越多,同时它的线性组合选取也可表示为X1、X2…XP,它们都被称为方差F1中的第一主成分。如果第一主成分不足以代表原有的P个变量信息时,就可以考虑选取F2,即第二个线性组合,借由它来反映原本的有效信息。在F2中可以不显示第一主成分中已有的信息,以数学语言来表达要求的话即Cov(F1,F2)=0,其中F2为第二主成分。所以按照实际原变量的变化需求,就可以构造出多个主成分指标。
      4.2人脸识别的技术特点

    人脸识别是模式识别中的重要分支,它是指通过计算机系统来分析人脸图像,从中获取有价值的识别信息,从而辨识身份。所以说从技术特点上来看,人脸识别具有以下几个关键特色。
     1、PCA算法
    算法大致步骤:
    设有m条n维数据。
    1)将原始数据按列组成n行m列矩阵X;
    2)将X的每一行(这里是图片也就是一张图片变换到一行)进行零均值化,即减去这一行的均值(样本中心化和标准化);将所有的样本融合到一个矩阵里面特征向量就是变换空间的基向量U=[u1,u2,u3,u4,…],脑袋里面要想到一个样本投影变换就是该空间的一个点,然后对于许多点可以用KNN等不同的方法进行分类。
    3)求出协方差矩阵C=1mXXTC=1mXXT C=\frac {1 }{m } XX^TC=m1XXT;
    4)求出协方差矩阵的特征值及对应的特征向量;
    5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P;
    6)Y=PXY=PX Y=PXY=PX即为降维到kk kk维后的数据。
      对数据进行中心化预处理,这样做的目的是要增加基向量的正交性,便于高维度向低纬度的投影,即便于更好的描述数据。
      对数据标准化的目的是消除特征之间的差异性,当原始数据不同维度上的特征的尺度不一致时,需要标准化步骤对数据进行预处理,使得在训练神经网络的过程中,能够加速权重参数的收敛。
      过中心化和标准化,最后得到均值为0,标准差为1的服从标准正态分布的数据。
      求协方差矩阵的目的是为了计算各维度之间的相关性,而协方差矩阵的特征值大小就反映了变换后在特征向量方向上变换的幅度,幅度越大,说明这个方向上的元素差异也越大(越有投影的必要,矩阵相乘的过程就是投影),故而选取合适的前k个能以及小的损失来大量的减少元数据的维度。

    2、PCA原理推导
    基于K-L展开的PCA特征提取:

    5.算法优化方法
    我用了三种方法对其进行优化
    1.采用动量梯度下降算法训练 BP 网络。
    训练样本定义如下:
    输入矢量为
    p =[-1 -2 3 1
    -1 1 5 -3]
    目标矢量为 t = [-1 -1 1 1]
    2. 采用贝叶斯正则化算法提高 BP 网络的推广能力。在本例中,我们采用两种训练方法,即 L-M 优化算法(trainlm)和贝叶斯正则化算法(trainbr),用以训练 BP 网络,使其能够拟合某一附加有白噪声的正弦样本数据。其中,样本数据可以采用如下MATLAB 语句生成:
    输入矢量:P = [-1:0.05:1];
    目标矢量:randn(’seed’,78341223);
    T = sin(2piP)+0.1randn(size§);
    3. 采用“提前停止”方法提高 BP 网络的推广能力。对于和例 2相同的问题,在本例中我们将采用训练函数 traingdx 和“提前停止”相结合的方法来训练 BP 网络,以提高 BP 网络的推广能力。在利用“提前停止”方法时,首先应分别定义训练样本、验证样本或测试样本,其中,验证样本是必不可少的。在本例中,我们只定义并使用验证样本,即有
    验证样本输入矢量:val.P = [-0.975:.05:0.975]
    验证样本目标矢量:val.T = sin(2
    pival.P)+0.1randn(size(val.P))
    值得注意的是,尽管“提前停止”方法可以和任何一种 BP 网络训练函数一起使用,但是不适合同训练速度过快的算法联合使用,比如 trainlm 函数,所以本例中我们采用训练速度相对较慢的变学习速率算法 traingdx 函数作为训练函数。
    参考文献

    [1] HongZiquan.AlgbricFeatureExcaciofmftfoReonino[JPatteo Recognition. 1991. 22 (1) :43~44.
    [2] Yuille A L Detcction Templates for Face Recognitio[JCognitive Neuroscience , 1991. 191-200
    [3]卢春雨张长水局城区城特征的快速人脸检测法[D北京:清华大学学报.1999.96 (1) ;4-6.
    [4]陈刚,减飞虎实用人脸识别系统的本征脸法实现[D]2001年5月230():45-46.
    [
    5]杜平,徐大为,刘重庆,基F整体特征的人脸识别方法的研究[12003年6月49 (3) ;382-383.
    [6] Chow G, Li X. Towards A System for Automatic Facial Feature Detctio[U] 1993. 2903)2-3.
    [7]杨变若,王煎法,杨未来人脸全局特iE识别研究[Z]1997年11月3(5):; 871-875.
    [8]边肇棋,张学工阎平凡等模式识别D]北京:清华大学出版社2000 302)16-17.

    致 谢

      从毕业设计的选题到论文的指导到最后定稿,期间遇到了无数的困难和阻碍,也曾想过对自己降低要求,也曾想过放弃最初想要坚持的设计,但是最后在孙老师和同学的鼓励和陪伴下,努力克服了所有的困难,独立完成了毕业设计和论文的书写。尤其是要感射我的论文指导老师孙老师,不厌其烦的对我的设计进行指导修改,耐心的帮助我改进设计帮助我搜集相关的资料,感谢孙老师如母亲--般的关怀,在孙老师身上不仅学习到了对学术严谨的态度,更被孙老师亲切无私的个人魅力所感染。
    
      还要感谢我的同学和其他所有的老师,他们严谨的学术态度,宽容待人严于律己的处世风范都使我受益良多。
    
    展开全文
  • LabVIEW入门第一天

    千次阅读 2020-02-19 22:17:27
    二,LabVIEW平台详细介绍 与 C 和BASIC 一样,LabVIEW也是通用的编程系统,有一个完成任何编程任务的庞大函数库。LabVIEW的函数库包括数据采集、GPIB、串口控制、数据分析、数据 LabVIEW标志 LabVIEW标志 显示及...

    在这里插入图片描述

    LabVIEW入门第一天

    从今天开始,我将分享我的LabVIEW的编程之路!欢迎各位相互学习讨论()!!!

    一,LabVIEW介绍

    LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。 LabVIEW软件是NI设计平台的核心,也是开发测量或控制系统的理想选择。 LabVIEW开发环境集成了工程师和科学家快速构建各种应用所需的所有工具,旨在帮助工程师和科学家解决问题、提高生产力和不断创新。

    二,LabVIEW平台详细介绍

    与 C 和BASIC 一样,LabVIEW也是通用的编程系统,有一个完成任何编程任务的庞大函数库。LabVIEW的函数库包括数据采集、GPIB、串口控制、数据分析、数据
    LabVIEW标志
    LabVIEW标志
    显示及数据存储,等等。LabVIEW也有传统的程序调试工具,如设置断点、以动画方式显示数据及其子程序(子VI)的结果、单步执行等等,便于程序的调试。

    LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种用图标代替文本行创建应用程序的图形化编程语言。传统文本编程语言根据语句和指令的先后顺序决定程序执行顺序,而 LabVIEW 则采用数据流编程方式,程序框图中节点之间的数据流向决定了VI及函数的执行顺序。VI指虚拟仪器,是 LabVIEW 的程序模块。

    LabVIEW 提供很多外观与传统仪器(如示波器、万用表)类似的控件,可用来方便地创建用户界面。用户界面在 LabVIEW 中被称为前面板。使用图标和连线,可以通过编程对前面板上的对象进行控制。这就是图形化源代码,又称G代码。LabVIEW 的图形化源代码在某种程度上类似于流程图,因此又被称作程序框图代码。

    三,LabVIEW平台特点

    尽可能采用了通用的硬件,各种仪器的差异主要是软件。

    可充分发挥计算机的能力,有强大的数据处理功能,可以创造出功能更强的仪器。

    用户可以根据自己的需要定义和制造各种仪器。

    虚拟仪器研究的另一个问题是各种标准仪器的互连及与计算机的连接。目前使用较多的是IEEE488 或 GPIB协议。未来的仪器也应当是网络化的。

    LabVIEW(Laboratory Virtual instrument Engineering Workbench)是一种图形化的编程语言的开发环境,它广泛地被工业界、学术界和研究实验室所接受,视为一个标准的数据采集和仪器控制软件。LabVIEW 集成了与满足 GPIB、VXI、RS-232和 RS-485 协议的硬件及数据采集卡通讯的全部功能。它还内置了便于应用TCP/IP、ActiveX等软件标准的库函数。这是一个功能强大且灵活的软件。利用它可以方便地建立自己的虚拟仪器,其图形化的界面使得编程及使用过程都生动有趣。

    图形化的程序语言,又称为 “G” 语言。使用这种语言编程时,基本上不写程序代码,取而代之的是流程图或框图。它尽可能利用了技术人员、科学家、工程师所熟悉的术语、图标和概念,因此,LabVIEW是一个面向最终用户的工具。它可以增强你构建自己的科学和工程系统的能力,提供了实现仪器编程和数据采集系统的便捷途径。使用它进行原理研究、设计、测试并实现仪器系统时,可以大大提高工作效率。

    利用 LabVIEW,可产生独立运行的可执行文件,它是一个真正的32位/64位编译器。像许多重要的软件一样,LabVIEW提供了Windows、UNIX、Linux、Macintosh的多种版本。

    它主要的方便就是,一个硬件的情况下,可以通过改变软件,就可以实现不同的仪器仪表的功能,非常方便,是相当于软件即硬件!现在的图形化主要是上层的系统,国内现在已经开发出图形化的单片机编程系统(支持32位的嵌入式系统,并且可以扩展的),不断完善中(大家可以搜索 CPUVIEW 会有更详细信息;)

    四,LabVIEW平台应用领域

    LABVIEW有很多优点,尤其是在某些特殊领域其特点尤其突出。

    测试测量:
    LABVIEW最初就是为测试测量而设计的,因而测试测量也就是现在LABVIEW最广泛的应用领域。经过多年的发展,LABVIEW在测试测量领域获得了广泛的承认。至今,大多数主流的测试仪器、数据采集设备都拥有专门的LabVIEW驱动程序,使用LabVIEW可以非常便捷的控制这些硬件设备。同时,用户也可以十分方便地找到各种适用于测试测量领域的LabVIEW工具包。这些工具包几乎覆盖了用户所需的所有功能,用户在这些工具包的基础上再开发程序就容易多了。有时甚至于只需简单地调用几个工具包中的函数,就可以组成一个完整的测试测量应用程序。

    控制:
    控制与测试是两个相关度非常高的领域,从测试领域起家的LabVIEW自然而然地首先拓展至控制领域。LabVIEW拥有专门用于控制领域的模块----LabVIEWDSC。除此之外,工业控制领域常用的设备、数据线等通常也都带有相应的LabVIEW驱动程序。使用LabVIEW可以非常方便的编制各种控制程序。

    仿真:LabVIEW包含了多种多样的数学运算函数,特别适合进行模拟、仿真、原型设计等工作。在设计机电设备之前,可以先在计算机上用LabVIEW搭建仿真原型,验证设计的合理性,找到潜在的问题。在高等教育领域,有时如果使用LabVIEW进行软件模拟,就可以达到同样的效果,使学生不致失去实践的机会。

    儿童教育:
    由于图形外观漂亮且容易吸引儿童的注意力,同时图形比文本更容易被儿童接受和理解,所以LabVIEW非常受少年儿童的欢迎。对于没有任何计算机知识的儿童而言,可以把LabVIEW理解成是一种特殊的"积木":把不同的原件搭在一起,就可以实现自己所需的功能。著名的可编程玩具"乐高积木"使用的就是LabVIEW编程语言。儿童经过短暂的指导就可以利用乐高积木提供的积木搭建成各种车辆模型、机器人等,再使用LabVIEW编写控制其运动和行为的程序。除了应用于玩具,LabVIEW还有专门用于中小学生教学使用的版本。

    快速开发:
    根据笔者参与的一些项目统计,完成一个功能类似的大型应用软件,熟练的LabVIEW程序员所需的开发时间,大概只是熟练的C程序员所需时间的1/5左右。所以,如果项目开发时间紧张,应该优先考虑使用LabVIEW,以缩短开发时间。

    跨平台:
    如果同一个程序需要运行于多个硬件设备之上,也可以优先考虑使用LabVIEW。LabVIEW具有良好的平台一致性。LabVIEW的代码不需任何修改就可以运行在常见的三大台式机操作系统上:Windows、Mac OS 及 Linux。除此之外,LabVIEW还支持各种实时操作系统和嵌入式设备,比如常见的PDA、FPGA以及运行VxWorks和PharLap系统的RT设备。

    五,LabVIEW平台开发系统

    每位LabVIEW用户的起点都是开发系统,这一开发系统也是图形化编程的基础环境。 以下软件包的功能相辅相成,可帮助用户满足当前和未来的需求。

    LabVIEW包括基本版,完整版和专业版。

    LabVIEW基本版:
    图形化用户界面开发
    数据采集
    仪器控制
    报告生成和文件I/O

    LabVIEW完整版:
    700多个数学/分析函数
    外部代码集成 (.dll)
    互联网连接
    高级用户界面开发

    LabVIEW专业版:
    应用发布 (creat.exe)
    开发管理
    源代码控制
    网络通信

    本博文摘抄链接: https://baike.so.com/doc/2068940-2188708.html

    图片:
    在这里插入图片描述

    展开全文
  • js面试题

    千次阅读 多人点赞 2019-04-09 19:42:32
    JavaScript 的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaScript 语言基础 ...BOM(浏览器对象模型):提供了浏览器窗口之间进行交互的对象和方法 JS 的基本数据类型和引用数据类型 ...

    JavaScript 的组成

    JavaScript 由以下三部分组成:

    • ECMAScript(核心):JavaScript 语言基础
    • DOM(文档对象模型):规定了访问 HTML 和 XML 的接口
    • BOM(浏览器对象模型):提供了浏览器窗口之间进行交互的对象和方法

    JS 的基本数据类型和引用数据类型

    • 基本数据类型:undefined、null、boolean、number、string、symbol
    • 引用数据类型:object、array、function

    检测浏览器版本版本有哪些方式?

    • 根据 navigator.userAgent // UA.toLowerCase().indexOf(‘chrome’)
    • 根据 window 对象的成员 // ‘ActiveXObject’ in window

    介绍 JS 有哪些内置对象?

    • 数据封装类对象:Object、Array、Boolean、Number、String
    • 其他对象:Function、Arguments、Math、Date、RegExp、Error
    • ES6 新增对象:Symbol、Map、Set、Promises、Proxy、Reflect

    说几条写 JavaScript 的基本规范?

    • 代码缩进,建议使用“四个空格”缩进
    • 代码段使用花括号{}包裹
    • 语句结束使用分号;
    • 变量和函数在使用前进行声明
    • 以大写字母开头命名构造函数,全大写命名常量
    • 规范定义 JSON 对象,补全双引号
    • 用{}和[]声明对象和数组

    如何编写高性能的 JavaScript?

    • 遵循严格模式:“use strict”;
    • 将 js 脚本放在页面底部,加快渲染页面
    • 将 js 脚本将脚本成组打包,减少请求
    • 使用非阻塞方式下载 js 脚本
    • 尽量使用局部变量来保存全局变量
    • 尽量减少使用闭包
    • 使用 window 对象属性方法时,省略 window
    • 尽量减少对象成员嵌套
    • 缓存 DOM 节点的访问
    • 通过避免使用 eval() 和 Function() 构造器
    • 给 setTimeout() 和 setInterval() 传递函数而不是字符串作为参数
    • 尽量使用直接量创建对象和数组
    • 最小化重绘(repaint)和回流(reflow)

    DOM 元素 e 的 e.getAttribute(propName)和 e.propName 有什么区别和联系

    • e.getAttribute(),是标准 DOM 操作文档元素属性的方法,具有通用性可在任意文档上使用,返回元素在源文件中设置的属性
    • e.propName 通常是在 HTML 文档中访问特定元素的特性,浏览器解析元素后生成对应对象(如 a 标签生成 HTMLAnchorElement),这些对象的特性会根据特定规则结合属性设置得到,对于没有对应特性的属性,只能使用 getAttribute 进行访问
    • e.getAttribute()返回值是源文件中设置的值,类型是字符串或者 null(有的实现返回"")
    • e.propName 返回值可能是字符串、布尔值、对象、undefined 等
    • 大部分 attribute 与 property 是一一对应关系,修改其中一个会影响另一个,如 id,title 等属性
    • 一些布尔属性<input hidden/>的检测设置需要 hasAttribute 和 removeAttribute 来完成,或者设置对应 property
    • <a href="../index.html">link</a>中 href 属性,转换成 property 的时候需要通过转换得到完整 URL
    • 一些 attribute 和 property 不是一一对应如:form 控件中<input value="hello"/>对应的是 defaultValue,修改或设置 value property 修改的是控件当前值,setAttribute 修改 value 属性不会改变 value property

    offsetWidth/offsetHeight,clientWidth/clientHeight 与 scrollWidth/scrollHeight 的区别

    • offsetWidth/offsetHeight 返回值包含 content + padding + border,效果与 e.getBoundingClientRect()相同
    • clientWidth/clientHeight 返回值只包含 content + padding,如果有滚动条,也不包含滚动条
    • scrollWidth/scrollHeight 返回值包含 content + padding + 溢出内容的尺寸

    描述浏览器的渲染过程,DOM 树和渲染树的区别?

    浏览器的渲染过程:

    • 解析 HTML 构建 DOM(DOM 树),并行请求 css/image/js
    • CSS 文件下载完成,开始构建 CSSOM(CSS 树)
    • CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)
    • 布局(Layout):计算出每个节点在屏幕中的位置
    • 显示(Painting):通过显卡把页面画到屏幕上

    DOM 树 和 渲染树 的区别:

    • DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素
    • 渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性

    重绘和回流(重排)的区别和关系?

    • 重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘
    • 回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流
    • 注意:JS 获取 Layout 属性值(如:offsetLeft、scrollTop、getComputedStyle 等)也会引起回流。因为浏览器需要通过回流计算最新值
    • 回流必将引起重绘,而重绘不一定会引起回流

    如何最小化重绘(repaint)和回流(reflow)?

    • 需要要对元素进行复杂的操作时,可以先隐藏(display:“none”),操作完成后再显示
    • 需要创建多个 DOM 节点时,使用 DocumentFragment 创建完后一次性的加入 document
    • 缓存 Layout 属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流
    • 尽量避免用 table 布局(table 元素一旦触发回流就会导致 table 里所有的其它元素回流)
    • 避免使用 css 表达式(expression),因为每次调用都会重新计算值(包括加载页面)
    • 尽量使用 css 属性简写,如:用 border 代替 border-width, border-style, border-color
      批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxx

    script 的位置是否会影响首屏显示时间?

    • 在解析 HTML 生成 DOM 过程中,js 文件的下载是并行的,不需要 DOM 处理到 script 节点。因此,script 的位置不影响首屏显示的开始时间。
    • 浏览器解析 HTML 是自上而下的线性过程,script 作为 HTML 的一部分同样遵循这个原则
    • 因此,script 会延迟 DomContentLoad,只显示其上部分首屏内容,从而影响首屏显示的完成时间

    解释 JavaScript 中的作用域与变量声明提升?

    JavaScript 作用域:

    • 在 Java、C 等语言中,作用域为 for 语句、if 语句或{}内的一块区域,称为作用域;
    • 而在 JavaScript 中,作用域为 function(){}内的区域,称为函数作用域。

    JavaScript 变量声明提升:

    • 在 JavaScript 中,函数声明与变量声明经常被 JavaScript 引擎隐式地提升到当前作用域的顶部。
    • 声明语句中的赋值部分并不会被提升,只有名称被提升
    • 函数声明的优先级高于变量,如果变量名跟函数名相同且未赋值,则函数声明会覆盖变量声明
    • 如果函数有多个同名参数,那么最后一个参数(即使没有定义)会覆盖前面的同名参数

    介绍 JavaScript 的原型,原型链?有什么特点?

    原型:

    • JavaScript 的所有对象中都包含了一个 [proto] 内部属性,这个属性所对应的就是该对象的原型
    • JavaScript 的函数对象,除了原型 [proto] 之外,还预置了 prototype 属性
    • 当函数对象作为构造函数创建实例时,该 prototype 属性值将被作为实例对象的原型 [proto]。

    原型链:

    • 当一个对象调用的属性/方法自身不存在时,就会去自己 [proto] 关联的前辈 prototype 对象上去找
    • 如果没找到,就会去该 prototype 原型 [proto] 关联的前辈 prototype 去找。依次类推,直到找到属性/方法或 undefined 为止。从而形成了所谓的“原型链”

    原型特点:

    • JavaScript 对象是通过引用来传递的,当修改原型时,与之相关的对象也会继承这一改变

    JavaScript 有几种类型的值?,你能画一下他们的内存图吗

    • 原始数据类型(Undefined,Null,Boolean,Number、String)-- 栈
    • 引用数据类型(对象、数组和函数)-- 堆
    • 两种类型的区别是:存储位置不同:
    • 原始数据类型是直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据;
    • 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;
    • 引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。
    • 当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

    JavaScript 如何实现一个类,怎么实例化这个类?

    1. 构造函数法(this + prototype) – 用 new 关键字 生成实例对象
      • 缺点:用到了 this 和 prototype,编写复杂,可读性差
      function Mobile(name, price){
         this.name = name;
         this.price = price;
       }
       Mobile.prototype.sell = function(){
          alert(this.name + ",售价 $" + this.price);
       }
       var iPhone7 = new Mobile("iPhone7", 1000);
       iPhone7.sell();
    
    1. Object.create 法 – 用 Object.create() 生成实例对象
      • 缺点:不能实现私有属性和私有方法,实例对象之间也不能共享数据
     var Person = {
         firstname: "Mark",
         lastname: "Yun",
         age: 25,
         introduce: function(){
             alert('I am ' + Person.firstname + ' ' + Person.lastname);
         }
     };
    
     var person = Object.create(Person);
     person.introduce();
    
     // Object.create 要求 IE9+,低版本浏览器可以自行部署:
     if (!Object.create) {
        Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
      };
     }
    
    1. 极简主义法(消除 this 和 prototype) – 调用 createNew() 得到实例对象
      • 优点:容易理解,结构清晰优雅,符合传统的"面向对象编程"的构造
     var Cat = {
       age: 3, // 共享数据 -- 定义在类对象内,createNew() 外
       createNew: function () {
         var cat = {};
         // var cat = Animal.createNew(); // 继承 Animal 类
         cat.name = "小咪";
         var sound = "喵喵喵"; // 私有属性--定义在 createNew() 内,输出对象外
         cat.makeSound = function () {
           alert(sound);  // 暴露私有属性
         };
         cat.changeAge = function(num){
           Cat.age = num; // 修改共享数据
         };
         return cat; // 输出对象
       }
     };
    
     var cat = Cat.createNew();
     cat.makeSound();
    
    1. ES6 语法糖 class – 用 new 关键字 生成实例对象
         class Point {
           constructor(x, y) {
             this.x = x;
             this.y = y;
           }
           toString() {
             return '(' + this.x + ', ' + this.y + ')';
           }
         }
    
      var point = new Point(2, 3);
    

    Javascript 如何实现继承?

    1. 构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上
    function Cat(name,color){
      Animal.apply(this, arguments);
      this.name = name;
      this.color = color;
    }
    
    1. 实例继承:将子对象的 prototype 指向父对象的一个实例
    Cat.prototype = new Animal();
    Cat.prototype.constructor = Cat;
    
    1. 拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象
    function extend(Child, Parent) {
       var p = Parent.prototype;
       var c = Child.prototype;
       for (var i in p) {
          c[i] = p[i];
       }
       c.uber = p;
    }
    
    1. 原型继承:将子对象的 prototype 指向父对象的 prototype
    function extend(Child, Parent) {
        var F = function(){};
         F.prototype = Parent.prototype;
         Child.prototype = new F();
         Child.prototype.constructor = Child;
         Child.uber = Parent.prototype;
    }
    
    1. ES6 语法糖 extends:class ColorPoint extends Point {}
    class ColorPoint extends Point {
        constructor(x, y, color) {
            super(x, y); // 调用父类的constructor(x, y)
            this.color = color;
        }
        toString() {
            return this.color + ' ' + super.toString(); // 调用父类的toString()
        }
    }
    

    js 继承方式及其优缺点

    原型链继承的缺点

    • 一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。

    借用构造函数(类式继承)

    • 借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。所以我们需要原型链+借用构造函数的模式,这种模式称为组合继承

    组合式继承

    • 组合式继承是比较常用的一种继承方法,其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。

    javascript 创建对象的几种方式?

    javascript 创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用 JSON;但写法有很多种,也能混合使用

    1. 对象字面量的方式
    person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
    
    1. 用 function 来模拟无参的构造函数
     function Person(){}
        var person=new Person();//定义一个function,如果使用new"实例化",该function可以看作是一个Class
            person.name="Mark";
            person.age="25";
            person.work=function(){
            alert(person.name+" hello...");
        }
    person.work();
    
    1. 用 function 来模拟参构造函数来实现(用 this 关键字定义构造的上下文属性)
    function Pet(name,age,hobby){
        this.name=name;//this作用域:当前对象
        this.age=age;
        this.hobby=hobby;
        this.eat=function(){
            alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员");
        }
    }
    var maidou =new Pet("麦兜",25,"coding");//实例化、创建对象
    maidou.eat();//调用eat方法
    
    1. 用工厂方式来创建(内置对象)
    var wcDog =new Object();
         wcDog.name="旺财";
         wcDog.age=3;
    wcDog.work=function(){
        alert("我是"+wcDog.name+",汪汪汪......");
    }
    wcDog.work();
    
    1. 用原型方式来创建
    function Dog(){
    
        }
    Dog.prototype.name="旺财";
    Dog.prototype.eat=function(){
        alert(this.name+"是个吃货");
    }
    var wangcai =new Dog();
    wangcai.eat();
    
    1. 用混合方式来创建
    function Car(name,price){
        this.name=name;
        this.price=price;
    }
        Car.prototype.sell=function(){
        alert("我是"+this.name+",我现在卖"+this.price+"万元");
        }
    var camry =new Car("凯美瑞",27);
    camry.sell();
    

    Javascript 作用链域?

    • 全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节
    • 如果当前作用域没有找到属性或方法,会向上层作用域查找,直至全局函数,这种形式就是作用域链

    谈谈 this 对象的理解

    • this 总是指向函数的直接调用者
    • 如果有 new 关键字,this 指向 new 出来的实例对象
    • 在事件中,this 指向触发这个事件的对象
    • IE 下 attachEvent 中的 this 总是指向全局对象 Window

    eval 是做什么的?

    eval 的功能是把对应的字符串解析成 JS 代码并运行

    • 应该避免使用 eval,不安全,非常耗性能(先解析成 js 语句,再执行)
    • 由 JSON 字符串转换为 JSON 对象的时候可以用 eval(’(’+ str +’)’);

    什么是 Window 对象? 什么是 Document 对象?

    • Window 对象表示当前浏览器的窗口,是 JavaScript 的顶级对象。
    • 我们创建的所有对象、函数、变量都是 Window 对象的成员。
    • Window 对象的方法和属性是在全局范围内有效的。
    • Document 对象是 HTML 文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点)
    • Document 对象使我们可以通过脚本对 HTML 页面中的所有元素进行访问
    • Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问

    介绍 DOM 的发展

    • DOM:文档对象模型(Document Object Model),定义了访问 HTML 和 XML 文档的标准,与编程语言及平台无关
    • DOM0:提供了查询和操作 Web 文档的内容 API。未形成标准,实现混乱。如:document.forms[‘login’]
    • DOM1:W3C 提出标准化的 DOM,简化了对文档中任意部分的访问和操作。如:JavaScript 中的 Document 对象
    • DOM2:原来 DOM 基础上扩充了鼠标事件等细分模块,增加了对 CSS 的支持。如:getComputedStyle(elem, pseudo)
    • DOM3:增加了 XPath 模块和加载与保存(Load and Save)模块。如:XPathEvaluator

    介绍 DOM0,DOM2,DOM3 事件处理方式区别

    DOM0 级事件处理方式:

    • btn.onclick = func;
    • btn.onclick = null;

    DOM2 级事件处理方式:

    • btn.addEventListener(‘click’, func, false);
    • btn.removeEventListener(‘click’, func, false);
    • btn.attachEvent(“onclick”, func);
    • btn.detachEvent(“onclick”, func);

    DOM3 级事件处理方式:

    • eventUtil.addListener(input, “textInput”, func);
    • eventUtil 是自定义对象,textInput 是 DOM3 级事件

    事件的三个阶段

    捕获、目标、冒泡

    介绍事件“捕获”和“冒泡”执行顺序和事件的执行次数?

    按照 W3C 标准的事件:首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段

    事件执行次数(DOM2-addEventListener):元素上绑定事件的个数

    • 注意 1:前提是事件被确实触发
    • 注意 2:事件绑定几次就算几个事件,即使类型和功能完全一样也不会“覆盖”

    事件执行顺序:判断的关键是否目标元素

    • 非目标元素:根据 W3C 的标准执行:捕获->目标元素->冒泡(不依据事件绑定顺序)
    • 目标元素:依据事件绑定顺序:先绑定的事件先执行(不依据捕获冒泡标准)
    • 最终顺序:父元素捕获->目标元素事件 1->目标元素事件 2->子元素捕获->子元素冒泡->父元素冒泡
    • 注意:子元素事件执行前提 事件确实“落”到子元素布局区域上,而不是简单的具有嵌套关系

    在一个 DOM 上同时绑定两个点击事件:一个用捕获,一个用冒泡。事件会执行几次,先执行冒泡还是捕获?

    • 该 DOM 上的事件如果被触发,会执行两次(执行次数等于绑定次数)
    • 如果该 DOM 是目标元素,则按事件绑定顺序执行,不区分冒泡/捕获
    • 如果该 DOM 是处于事件流中的非目标元素,则先执行捕获,后执行冒泡

    事件的代理/委托

    事件委托是指将事件绑定目标元素的到父元素上,利用冒泡机制触发该事件

    优点:

    • 可以减少事件注册,节省大量内存占用
    • 可以将事件应用于动态添加的子元素上

    缺点: 使用不当会造成事件在不应该触发时触发

    示例:

    ulEl.addEventListener('click', function(e){
        var target = event.target || event.srcElement;
        if(!!target && target.nodeName.toUpperCase() === "LI"){
            console.log(target.innerHTML);
        }
    }, false);
    

    IE 与火狐的事件机制有什么区别? 如何阻止冒泡?

    IE 只事件冒泡,不支持事件捕获;火狐同时支持件冒泡和事件捕获。

    阻止冒泡:

    • 取消默认操作: w3c 的方法是 e.preventDefault(),IE 则是使用 e.returnValue = false;
    • return false javascript 的 return false 只会阻止默认行为,而是用 jQuery 的话则既阻止默认行为又防止对象冒泡。
    • 阻止冒泡 w3c 的方法是 e.stopPropagation(),IE 则是使用 e.cancelBubble = true
    [js] view plaincopy
    function stopHandler(event)
    
        window.event?window.event.cancelBubble=true:event.stopPropagation();
    
    }
    

    参考链接:浅谈 javascript 事件取消和阻止冒泡-开源中国 2015

    IE 的事件处理和 W3C 的事件处理有哪些区别?(必考)

    绑定事件

    • W3C: targetEl.addEventListener(‘click’, handler, false);
    • IE: targetEl.attachEvent(‘onclick’, handler);

    删除事件

    • W3C: targetEl.removeEventListener(‘click’, handler, false);
    • IE: targetEl.detachEvent(event, handler);

    事件对象

    • W3C: var e = arguments.callee.caller.arguments[0]
    • IE: window.event

    事件目标

    • W3C: e.target
    • IE: window.event.srcElement

    阻止事件默认行为

    • W3C: e.preventDefault()
    • IE: window.event.returnValue = false’

    阻止事件传播

    • W3C: e.stopPropagation()
    • IE: window.event.cancelBubble = true

    W3C 事件的 target 与 currentTarget 的区别?

    • target 只会出现在事件流的目标阶段
    • currentTarget 可能出现在事件流的任何阶段
    • 当事件流处在目标阶段时,二者的指向相同
    • 当事件流处于捕获或冒泡阶段时:currentTarget 指向当前事件活动的对象(一般为父级)

    如何派发事件(dispatchEvent)?(如何进行事件广播?)

    • W3C: 使用 dispatchEvent 方法
    • IE: 使用 fireEvent 方法
    var fireEvent = function(element, event){
        if (document.createEventObject){
            var mockEvent = document.createEventObject();
            return element.fireEvent('on' + event, mockEvent)
        }else{
            var mockEvent = document.createEvent('HTMLEvents');
            mockEvent.initEvent(event, true, true);
            return !element.dispatchEvent(mockEvent);
        }
    }
    

    什么是函数节流?介绍一下应用场景和原理?

    • 函数节流(throttle)是指阻止一个函数在很短时间间隔内连续调用。 只有当上一次函数执行后达到规定的时间间隔,才能进行下一次调用。 但要保证一个累计最小调用间隔(否则拖拽类的节流都将无连续效果)
    • 函数节流用于 onresize, onscroll 等短时间内会多次触发的事件
    • 函数节流的原理:使用定时器做时间节流。 当触发一个事件时,先用 setTimout 让这个事件延迟一小段时间再执行。 如果在这个时间间隔内又触发了事件,就 clearTimeout 原来的定时器, 再 setTimeout 一个新的定时器重复以上流程。

    函数节流简单实现:

    function throttle(method, context) {
         clearTimeout(methor.tId);
         method.tId = setTimeout(function(){
             method.call(context);
         }100); // 两次调用至少间隔 100ms
    }
    // 调用
    window.onresize = function(){
        throttle(myFunc, window);
    }
    

    区分什么是“客户区坐标”、“页面坐标”、“屏幕坐标”?

    • 客户区坐标:鼠标指针在可视区中的水平坐标(clientX)和垂直坐标(clientY)
    • 页面坐标:鼠标指针在页面布局中的水平坐标(pageX)和垂直坐标(pageY)
    • 屏幕坐标:设备物理屏幕的水平坐标(screenX)和垂直坐标(screenY)

    如何获得一个 DOM 元素的绝对位置?

    • elem.offsetLeft:返回元素相对于其定位父级左侧的距离
    • elem.offsetTop:返回元素相对于其定位父级顶部的距离
    • elem.getBoundingClientRect():返回一个 DOMRect 对象,包含一组描述边框的只读属性,单位像素

    分析 [‘1’, ‘2’, ‘3’].map(parseInt) 答案是多少?(常考)

    答案:[1, NaN, NaN]

    parseInt(string, radix) 第 2 个参数 radix 表示进制。省略 radix 或 radix = 0,则数字将以十进制解析

    map 每次为 parseInt 传 3 个参数(elem, index, array),其中 index 为数组索引

    因此,map 遍历 [“1”, “2”, “3”],相应 parseInt 接收参数如下

    parseInt('1', 0);  // 1
    parseInt('2', 1);  // NaN
    parseInt('3', 2);  // NaN
    

    所以,parseInt 参数 radix 不合法,导致返回值为 NaN

    new 操作符具体干了什么?

    • 创建实例对象,this 变量引用该对象,同时还继承了构造函数的原型
    • 属性和方法被加入到 this 引用的对象中
    • 新创建的对象由 this 所引用,并且最后隐式的返回 this

    用原生 JavaScript 的实现过什么功能吗?

    封装选择器、调用第三方 API、设置和获取样式(自由回答)

    解释一下这段代码的意思吗?

      [].forEach.call($$("*"), function(el){
          el.style.outline = "1px solid #" + (~~(Math.random()*(1<<24))).toString(16);
      })
    

    解释:获取页面所有的元素,遍历这些元素,为它们添加 1 像素随机颜色的轮廓(outline)

    • ( s e l ) / / (sel) // (sel)//函数被许多现代浏览器命令行支持,等价于 document.querySelectorAll(sel)
    • [].forEach.call(NodeLists) // 使用 call 函数将数组遍历函数 forEach 应到节点元素列表
    • el.style.outline = “1px solid #333” // 样式 outline 位于盒模型之外,不影响元素布局位置
    • (1<<24) // parseInt(“ffffff”, 16) == 16777215 == 2^24 - 1 // 1<<24 == 2^24 == 16777216
    • Math.random()*(1<<24) // 表示一个位于 0 到 16777216 之间的随机浮点数
    • ~~Math.random()*(1<<24) // ~~ 作用相当于 parseInt 取整
    • (~~(Math.random()*(1<<24))).toString(16) // 转换为一个十六进制-

    JavaScript 实现异步编程的方法?

    • 回调函数
    • 事件监听
    • 发布/订阅
    • Promises 对象
    • Async 函数[ES7]

    web 开发中会话跟踪的方法有哪些

    • cookie
    • session
    • url 重写
    • 隐藏 input
    • ip 地址

    什么是闭包(closure),为什么要用它?

    闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域

    闭包的特性:

    • 函数内再嵌套函数
    • 内部函数可以引用外层的参数和变量
    • 参数和变量不会被垃圾回收机制回收

    javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?

    use strict 是一种 ECMAscript 5 添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,使 JS 编码更加规范化的模式,消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为

    如何判断一个对象是否属于某个类?

    // 使用instanceof (待完善)
       if(a instanceof Person){
           alert('yes');
       }
    

    js 延迟加载的方式有哪些?

    defer 和 async、动态创建 DOM 方式(用得最多)、按需异步载入 js

    defer 和 async

    defer 并行加载 js 文件,会按照页面上 script 标签的顺序执行 async 并行加载 js 文件,下载完成立即执行,不会按照页面上 script 标签的顺序执行

    Ajax 是什么? 如何创建一个 Ajax?

    ajax 的全称:Asynchronous Javascript And XML

    异步传输+js+xml

    所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验

    • 创建 XMLHttpRequest 对象,也就是创建一个异步调用对象
    • 建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、URL 及验证信息
    • 设置响应 HTTP 请求状态变化的函数
    • 发送 HTTP 请求
    • 获取异步调用返回的数据
    • 用 JavaScript 和 DOM 实现局部刷新

    同步和异步的区别?

    • 同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作
    • 异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容

    documen.write 和 innerHTML 的区别

    • document.write 只能重绘整个页面
    • innerHTML 可以重绘页面的一部分

    DOM 操作——怎样添加、移除、移动、复制、创建和查找节点?

    创建新节点

    • createDocumentFragment() //创建一个 DOM 片段
    • createElement() //创建一个具体的元素
    • createTextNode() //创建一个文本节点

    添加、移除、替换、插入

    • appendChild()
    • removeChild()
    • replaceChild()
    • insertBefore() //在已有的子节点前插入一个新的子节点

    查找

    • getElementsByTagName() //通过标签名称
    • getElementsByName() // 通过元素的 Name 属性的值(IE 容错能力较强,会得到一个数组,其中包括 id 等于 name 值的) * getElementById() //通过元素 Id,唯一性

    那些操作会造成内存泄漏?

    • 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在
    • 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收
    • setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏
    • 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

    渐进增强和优雅降级

    • 渐进增强 :针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
    • 优雅降级 :一开始就构建完整的功能,然后再针对低版本浏览器进行兼容

    Javascript 垃圾回收方法

    标记清除(mark and sweep)

    • 这是 JavaScript 最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”
    • 垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了

    引用计数(reference counting)

    • 在低版本 IE 中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加 1,如果该变量的值变成了另外一个,则这个值得引用次数减 1,当这个值的引用次数变为 0 的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为 0 的值占用的空间

    参考链接 内存管理-MDN

    用过哪些设计模式?

    1. 工厂模式:
    • 主要好处就是可以消除对象间的耦合,通过使用工程方法而不是 new 关键字。将所有实例化的代码集中在一个位置防止代码重复
    • 工厂模式解决了重复实例化的问题 ,但还有一个问题,那就是识别问题,因为根本无法 搞清楚他们到底是哪个对象的实例
    function createObject(name,age,profession){
        //集中实例化的函数
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        obj.profession = profession;
        obj.move = function () {
            return this.name + ' at ' + this.age + ' engaged in ' + this.profession;
        };
        return obj;
    }
    var test1 = createObject('trigkit4',22,'programmer');//第一个实例var test2 = createObject('mike',25,'engineer');//第二个实例
    
    1. 构造函数模式
    • 使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于
    • 构造函数方法没有显示的创建对象 (new Object());
    • 直接将属性和方法赋值给 this 对象;
    • 没有 renturn 语句

    说说你对闭包的理解

    使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在 js 中,函数即闭包,只有函数才会产生作用域的概念

    闭包有三个特性:

    • 函数嵌套函数
    • 函数内部可以引用外部的参数和变量
    • 参数和变量不会被垃圾回收机制回收

    请解释一下 JavaScript 的同源策略

    • 概念:同源策略是客户端脚本(尤其是 Javascript)的重要的安全度量标准。它最早出自 Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议
    • 指一段脚本只能读取来自同一来源的窗口和文档的属性

    为什么要有同源限制?

    我们举例说明:比如一个黑客程序,他利用 Iframe 把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过 Javascript 读取到你的表单中 input 中的内容,这样用户名,密码就轻松到手了。]

    缺点: 现在网站的 JS 都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 merge 后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节

    实现一个函数 clone,可以对 JavaScript 中的 5 种主要的数据类型(包括 Number、String、Object、Array、Boolean)进行值复制(常考)

    function deepClone(obj) {
        if (!isObject(obj)) {
            throw new Error('obj 不是一个对象!')
        }
    
        let isArray = Array.isArray(obj)
        let cloneObj = isArray ? [] : {}
        for (let key in obj) {
            cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
        }
    
        return cloneObj
    }
    

    注意:for…in 法不支持拷贝 func、date、reg 和 err

    // 代理法
    function deepClone(obj) {
        if (!isObject(obj)) {
            throw new Error('obj 不是一个对象!')
        }
    
        let isArray = Array.isArray(obj)
        let cloneObj = isArray ? [...obj] : { ...obj }
        Reflect.ownKeys(cloneObj).forEach(key => {
            cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
        })
    
        return cloneObj
    }
    

    说说严格模式的限制

    • 严格模式主要有以下限制:
    • 变量必须声明后再使用
    • 函数的参数不能有同名属性,否则报错
    • 不能使用 with 语句
    • 不能对只读属性赋值,否则报错
    • 不能使用前缀 0 表示八进制数,否则报错
    • 不能删除不可删除的属性,否则报错
    • 不能删除变量 delete prop,会报错,只能删除属性 delete global[prop]
    • eval 不会在它的外层作用域引入变量
    • eval 和 arguments 不能被重新赋值
    • arguments 不会自动反映函数参数的变化
    • 不能使用 arguments.callee
    • 不能使用 arguments.caller
    • 禁止 this 指向全局对象
    • 不能使用 fn.caller 和 fn.arguments 获取函数调用的堆栈
    • 增加了保留字(比如 protected、static 和 interface)

    如何删除一个 cookie

    将时间设为当前时间往前一点

    var date = new Date();
    date.setDate(date.getDate() - 1);//真正的删除
    

    setDate()方法用于设置一个月的某一天

    expires 的设置

      document.cookie = 'user='+ encodeURIComponent('name')  + ';expires = ' + new Date(0)
    

    编写一个方法 求一个字符串的字节长度

    假设:一个英文字符占用一个字节,一个中文字符占用两个字节

    function GetBytes(str){
    
            var len = str.length;
    
            var bytes = len;
    
            for(var i=0; i<len; i++){
    
                if (str.charCodeAt(i) > 255) bytes++;
    
            }
    
            return bytes;
    
        }
    
    alert(GetBytes("你好,as"));
    

    请解释什么是事件代理

    事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是 DOM 元素的事件冒泡。使用事件代理的好处是可以提高性能

    attribute 和 property 的区别是什么?

    • attribute 是 dom 元素在文档中作为 html 标签拥有的属性;
    • property 就是 dom 元素在 js 中作为对象拥有的属性。
    • 对于 html 的标准属性来说,attribute 和 property 是同步的,是会自动更新的
    • 但是对于自定义的属性来说,他们是不同步的

    页面编码和被请求的资源编码如果不一致如何处理?

    • 后端响应头设置 charset
    • 前端页面<meta>设置 charset

    <script> 放在 </body> 之前和之后有什么区别?浏览器会如何解析它们?

    按照 HTML 标准,在结束后出现<script>或任何元素的开始标签,都是解析错误
    虽然不符合 HTML 标准,但浏览器会自动容错,使实际效果与写在</body>之前没有区别
    浏览器的容错机制会忽略<script>之前的,视作<script>仍在 body 体内。省略</body></html>闭合标签符合 HTML 标准,服务器可以利用这一标准

    <script> 放在 </head> 中会有什么问题?

    在浏览器渲染页面之前,它需要通过解析HTML标记然后构建DOM树。在这个过程中,如果解析器遇到了一个脚本(script),它就会停下来,并且执行这个脚本,然后才会继续解析HTML。如果遇到了一个引用外部资源的脚本(script),它就必须停下来等待这个脚本资源的下载,而这个行为会导致一个或者多个的网络往返,并且会延迟页面的首次渲染时间。

    还有一点是需要我们注意的,那就是外部引入的脚本(script)会阻塞浏览器的并行下载,HTTP/1.1规范表明,浏览器在每个主机下并行下载的组件不超过两个(也就是说,浏览器一次只能够同时从同一个服务器加载两个脚本);如果你网站的图片是通过多个服务器提供的,那么按道理来说,你的网站可以一次并行下载多张图片。但是,当我们网站在加载脚本的时候;浏览器不会再启动任何其它的下载,即使这些组件来自不同的服务器。

    异步加载 JS 的方式有哪些?

    • 设置<script>属性 async=“async” (一旦脚本可用,则会异步执行)
    • 动态创建 script DOM:document.createElement(‘script’);
    • XmlHttpRequest 脚本注入
    • 异步加载库 LABjs
    • 模块加载器 Sea.js

    JavaScript 中,调用函数有哪几种方式?

    • 方法调用模式 Foo.foo(arg1, arg2);
    • 函数调用模式 foo(arg1, arg2);
    • 构造器调用模式 (new Foo())(arg1, arg2);
    • call/applay 调用模式 Foo.foo.call(that, arg1, arg2);
    • bind 调用模式 Foo.foo.bind(that)(arg1, arg2)();

    简单实现 Function.bind 函数?

      if (!Function.prototype.bind) {
        Function.prototype.bind = function(that) {
          var func = this, args = arguments;
          return function() {
            return func.apply(that, Array.prototype.slice.call(args, 1));
          }
        }
      }
      // 只支持 bind 阶段的默认参数:
      func.bind(that, arg1, arg2)();
    
      // 不支持以下调用阶段传入的参数:
      func.bind(that)(arg1, arg2);
    

    列举一下 JavaScript 数组和对象有哪些原生方法

    • 数组:
      • arr.concat(arr1, arr2, arrn);
      • arr.join(",");
      • arr.sort(func);
      • arr.pop();
      • arr.push(e1, e2, en);
      • arr.shift();
      • unshift(e1, e2, en);
      • arr.reverse();
      • arr.slice(start, end);
      • arr.splice(index, count, e1, e2, en);
      • arr.indexOf(el);
      • arr.includes(el); // ES6
    • 对象:
      • object.hasOwnProperty(prop);
      • object.propertyIsEnumerable(prop);
      • object.valueOf();
      • object.toString();
      • object.toLocaleString();
      • Class.prototype.isPropertyOf(object);

    Array.slice() 与 Array.splice() 的区别?

    • slice – “读取”数组指定的元素,不会对原数组进行修改

      • 语法:arr.slice(start, end)
      • start 指定选取开始位置(含)
      • end 指定选取结束位置(不含)
    • splice

      • “操作”数组指定的元素,会修改原数组,返回被删除的元素
      • 语法:arr.splice(index, count, [insert Elements])
      • index 是操作的起始位置
      • count = 0 插入元素,count > 0 删除元素
      • [insert Elements] 向数组新插入的元素

    JavaScript 对象生命周期的理解?

    • 当创建一个对象时,JavaScript 会自动为该对象分配适当的内存
    • 垃圾回收器定期扫描对象,并计算引用了该对象的其他对象的数量
    • 如果被引用数量为 0,或惟一引用是循环的,那么该对象的内存即可回收

    哪些操作会造成内存泄漏?

    • JavaScript 内存泄露指对象在不需要使用它时仍然存在,导致占用的内存不能使用或回收
    • 未使用 var 声明的全局变量
    • 闭包函数(Closures)
    • 循环引用(两个对象相互引用)
    • 控制台日志(console.log)
    • 移除存在绑定事件的 DOM 元素(IE)

    在 javascript 中,1 与 Number(1)有什么区别 [易混淆]

    var a = Number(1) // 1
    var b = new Number(1)  // Number {[[PrimitiveValue]]: 1}
    typeof (a) // number
    typeof (b) // object
    a == b // true
    
    • var a = 1 是一个常量,而 Number(1)是一个函数
    • new Number(1)返回的是一个对象
    • a==b 为 true 是因为所以在求值过程中,总是会强制转为原始数据类型而非对象,例如下面的代码:
    typeof 123 // "number"
    typeof new Number(123) // "object"
    123 instanceof Number // false
    (new Number(123)) instanceof Number // true
    123 === new Number(123) // false
    

    参考地址:面试题:在 javascript 中,1 与 Number(1)有什么区别

    console.log(!!(new Boolean(false))输出什么 [易混淆]

    true

    布尔的包装对象 Boolean 的对象实例,对象只有在 null 与 undefined 时,才会认定为布尔的 false 值,布尔包装对象本身是个对象,对象->布尔 都是 true,所以 new Boolean(false)其实是布尔的 true,看下面这段代码:

    if(new Boolean(false)){
        alert('true!!');
    }
    

    只有使用了 valueOf 后才是真正的转换布尔值,与上面包装对象与原始资料转换说明的相同:

    !!(new Boolean(false))  //true
    (new Boolean(false)).valueOf() //false
    

    为什么 JS 是单线程,而不是多线程 [常考]

    • 单线程是指 JavaScript 在执行的时候,有且只有一个主线程来处理所有的任务。
    • 目的是为了实现与浏览器交互。
    • 我们设想一下,如果 JavaScript 是多线程的,现在我们在浏览器中同时操作一个 DOM,一个线程要求浏览器在这个 DOM 中添加节点,而另一个线程却要求浏览器删掉这个 DOM 节点,那这个时候浏览器就会很郁闷,他不知道应该以哪个线程为准。所以为了避免此类现象的发生,降低复杂度,JavaScript 选择只用一个主线程来执行代码,以此来保证程序执行的一致性。

    浏览器中的 Event Loop

    浏览器中的Eventloop

    • 主线程运行的时候会生成堆(heap)和栈(stack);
    • js 从上到下解析方法,将其中的同步任务按照执行顺序排列到执行栈中;
    • 当程序调用外部的 API 时,比如 ajax、setTimeout 等,会将此类异步任务挂起,继续执行执行栈中的任务,等异步任务返回结果后,再按照执行顺序排列到事件队列中;
    • 主线程先将执行栈中的同步任务清空,然后检查事件队列中是否有任务,如果有,就将第一个事件对应的回调推到执行栈中执行,若在执行过程中遇到异步任务,则继续将这个异步任务排列到事件队列中。
    • 主线程每次将执行栈清空后,就去事件队列中检查是否有任务,如果有,就每次取出一个推到执行栈中执行,这个过程是循环往复的… …,这个过程被称为“Event Loop 事件循环”

    参考地址:Event Loop 这个循环你晓得么?(附 GIF 详解)-饿了么前端

    展开全文
  • vm虚拟机安装教程win7

    千次阅读 2019-03-28 21:00:50
    vm虚拟机安装教程win7@[TOC](vm虚拟机安装教程win7) ...1 、打开VMware软件,进去虚拟机首页,如下图所示:新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一...


    VMWare是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。该软件方便实用,但想必有很多新接触的新手还是很陌生的。
    1 、打开VMware软件,进去虚拟机首页,如下图所示:

    在这里插入图片描述
    2、点击创建新的虚拟机,进入新建虚拟机界面,会有典型和自定义高级选项,默认选项是典型,我们保持默认选项,然后点击下一步。

    在这里插入图片描述
    3、点击下一步后会进入新建安装虚拟机向导界面,在新建安装虚拟机向导界面我们要选择第二个选项,安装程序光盘映像文件,映像文件可以百度下载,下载完成时记住下载位置,在这里选择我们下载的镜像文件,会自动识别系统,如下

    在这里插入图片描述
    4、点击下一步,给虚拟机起一个名字和密码,这里可以自定义名字密码,然后点击下一步 如下:

    在这里插入图片描述
    5、选择虚拟机保存的位置,建议放在除C盘之外的其他硬盘内,然后选下一步如下图:

    在这里插入图片描述
    6、点击下一步后,会进入虚拟机设置界面,可以设置虚拟机的处理器以及内存大小等配置信息,在这里,要根据自己电脑的配置来设置,可以选择默认保持不变,虚拟机设置完成后,磁盘大小不方便进行修改,所以本机存储空间充足最好多设置磁盘空间。
    在这里插入图片描述

    7、点击下一步,虚拟机则全部配置完成,出现下图:在这里插入图片描述
    8、点击完成,开始创建虚拟机,需注意,创建虚拟机需要较长的时间,需要在时间比较充裕的时间下进行安装。

    安装结束后,我们就成功安装上了,就可以使用了。这就是win7 vm虚拟机安装的全部教程。
    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目Value
    电脑$1600
    手机$12
    导管$1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列第二列第三列
    第一列文本居中第二列文本居右第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPEASCIIHTML
    Single backticks'Isn't this fun?'‘Isn’t this fun?’
    Quotes"Isn't this fun?"“Isn’t this fun?”
    Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to- HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

    Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • 即它是一个10分类任务的解决办法。下图是它的一个基本的网络结构。 网络结构图中显示的很清楚。它包括了两个卷积层,两个下采样层,两个全连接层和一个激活层,最后有一个sotfmax分类层。可以说,LeNet麻雀虽小,...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    测试开发笔记 第一章 测试基础 7 什么是软件测试: 7 ★软件测试的目的、意义:(怎么做好软件测试) 7 3.软件生命周期: 7 第二章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 ...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    C#基础教程-c#实例教程,适合初学者。 第一章 C#语言基础 本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     QQ客户端登录界面,中部有三个JPanel,有一个叫选项窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...
  • 1、使用了线程池来管理下载任务 2、使用LruCache来缓存图片 3、使用手机来缓存图片 4、GridView滑动的时候取消下载任务,静止的时候进行下载,GridView滑动更加的流畅 5、降低了代码的耦合性,结构更加的清晰,便于...
  • 微信小程序源码大全

    万次阅读 多人点赞 2018-02-06 10:36:02
    微信小程序 - TODOS(任务清单)(zce/weapp-todos) 微信小程序 - 企业宣传小程序(yaoshanliang/weapp-ssha) 微信小程序demo:足球,赛事分析 小程序简易导航 小程序demo:办公审批 小...
  • 1. Handler + Thread 异步执行任务 在UI线程中开启子线程,使用Handler 发消息,通知主线程更新UI 参考链接: http://my.oschina.net/keeponmoving/blog/61129 直接在UI线程中开启子线程来更新TextView显示的内容,运行...
  • office2019专业增强版64位和32位安装包收集整理

    万次阅读 多人点赞 2019-05-18 17:59:10
    只需单击“视图”选项,然后在“任务视图”组或“资源视图”组中,再单击要运用的视图就行了,如需查看一切可用视图,点击“甘特图”→“其他视图”,再从“其他视图”对话框中的选项中中止选择即可。    ...
  • 关于Hadoop下运行MapReduce任务卡在Map0%和Reduce0%的解决办法 检查核心配置 mapred-site.xml文件 检查以下配置信息,如果没有该信息,则添加上去 ![在这里插入图片描述]...
  • Android从SD读取图片并显示

    千次阅读 2014-02-20 16:45:14
    从SD读取图片转为预览图(点阵图,类似马赛克),2.保存当前预览图到特定文件夹,保存为一个txt,txt里存的是像素矩阵。3.从那个特定文件夹里读取像素矩阵,显示为预览图。 今天一下午和一晚上都在纠结第3个任务...
  • 输入一张特定格式的答题卡图片(答题卡中题目数量和选项个数是固定的),能够输出此答题卡中答案的准确率。运行效果如下: 输入一张答题卡图片 输出结果 对于这类任务,先整理一下图像处理的思路。 我们输入的是...
  • 获取手机的本地图片就是使用ContentResolver类查询本地的数据库,只不过需要使用该类进行查询,并且该类中提供了增删改查的响应的方法。本篇博文并不对ContentResolver进行详细的介绍,相比大家在书上面已经了解到了...
  • 【实战】python以及opencv实现信用的数字识别

    千次阅读 多人点赞 2019-08-15 18:53:38
    本项目利用python以及opencv实现信用的数字识别 前期准备 导入工具包 定义功能函数 模板图像处理 读取模板图像 cv2.imread(img) 灰度化处理 cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 二值化 cv2.threshold() ...
  • Android 框架练成 教你打造高效的图片加载框架

    万次阅读 多人点赞 2014-12-12 09:29:07
    转载请标明出处:...但是作为一名合格的程序猿,必须懂其中的实现原理,于是乎,今天我就带大家一起来设计一个加载网络、本地的图片框架。有人可能会说,自己
  • 如下图,在sdcard上有4张图片, 打开app,则会吧sd上的所有图片读取,并显示出来,读取的过程有进度条显示。 制作过程如下: 1、首先,res\values\strings.xml对字符设置如下,没有什么特别的。
  • 红外图像数据集

    万次阅读 多人点赞 2019-12-30 15:46:38
    用于行人检测任务 有四种标签:person(好分辨);people(难分辨);cyclist(骑车的人);person?(人工不能分辨)。 共计95,328个可见光-红外图像对,总数为103,128个标注,1182个人。 1.2、获取 作者GitHub...
  • 第六章 图片

    千次阅读 2019-09-26 16:13:09
    文章目录从网络加载一个10M的图片(大图加载),说下注意事项?有关Bitmap导致OOM的原因知道吗?如何优化?说一下三级缓存的原理?说说你平常会使用的一些第三方图片加载库,最好给我谈谈它的原理?Glide源码分析?...
  • android教你打造独一无二的图片加载框架

    千次阅读 热门讨论 2016-12-08 20:32:02
    不过或许有人问为什么忙着okhttp怎么又扯到了图片加载上了。其实,最近想实现下断点续传以及多文件下载,但并不知道怎么搞。群里有小伙伴提出了控制线程池来实现。然后我就想到了图片加载需要控制线程池,所以在此...
  • 多类别动物图片分类任务(上) 在学习了大约2周的机器学习和深度学习的基础知识,并跑了十多个模型之后,老师给我布置了一项真正的任务,利用已经收集到的图片信息,构建并训练模型,一期目标使得精度达到84%,二期...
  • Android图片选择大家都知道网上有很多第三方的图片选择器,但是到了自己真正的项目中,可能会有不同的需求,需要自己去修改。因此我自己根据鸿洋大神的慕课网视频写了一个图片选择器,又对代码进行了修改,方便大家...
  • excel图片放大预览 在Excel中预览图片问题 (Preview Picture Problems in Excel) In the good old days of Excel, you could change a workbook setting, and see a preview picture of the file contents, before ...
  • //为sd下面创建testGridView文件夹,将图片放入其中 //为了方便测试,我们这里只存入一张图片,将其路径后面添加数字进行区分,到后面要获取图片时候再处理该路径。 for(int i=0;i;i++){ mList.add(url+"/"+i);...
  • 之前展示图片都是通过 , 每次都请求服务器, 加载比较慢; 如何做到显示图片的时候先从本地获取,没有则联网下载,缓存到本地;下次直接从本地拿,无需再联网; 我用Android机测试是成功的,苹果机还没有试,有问题欢迎...
  • MainActivity如下: package cc.patience4; import cc.patience4.R; import android.os.Bundle;... * 采用瀑布流的形式加载大量网络图片 * 详细分析参见WaterfallScrollView * * 更新说明: * 该示
  • 异步加载图片的例子,网上也比较多,大部分用了HashMap> imageCache ,但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用...
  • [Deep-Learning-with-Python]GAN图片生成

    千次阅读 2018-09-07 21:16:27
    GAN 由Goodfellow等人于2014年引入的生成对抗网络(GAN)是用于学习图像潜在...起初,伪造者的任务非常糟糕。他将他的一些假货与真正的毕加索混合在一起,并将它们全部展示给艺术品经销商。艺术品经销商对每幅画...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,706
精华内容 24,682
关键字:

任务卡图片