连载文章,长期更新,欢迎关注:


写在前面

第1章-ROS入门必备知识

第2章-C++编程范式

第3章-OpenCV图像处理

3.1 认识图像数据

3.2 图像滤波

3.3 图像变换

3.4 图像特征点提取

第4章-机器人传感器

第5章-机器人主机

第6章-机器人底盘

第7章-SLAM中的数学基础

第8章-激光SLAM系统

第9章-视觉SLAM系统

第10章-其他SLAM系统

第11章-自主导航中的数学基础

第12章-典型自主导航系统

第13章-机器人SLAM导航综合实战


特征点提取算法能帮助计算机获取图像的区域特征信息,并应用于图像识别、图像匹配、三维重建、物体跟踪等领域。在实际工程中,具有很高的应用价值。在图像领域,特征点(feature points)也常常被称为关键点(key points)或兴趣点(interest points)。特征点的提取有多种算法,可以从图像纹理信息来提取,也可以通过图像区域灰度统计信息来,或者通过频谱变化、小波变换等变换后在变换空间进行提取。本节将对最常用的SIFT(scale invariant feature transform,尺度不变特征变换)特征点、SURF(Speeded Up Robust Features,加速稳健特征)特征点和ORB(Oriented FAST and Rotated BRIEF,快速特征点提取和描述)特征点进行分析和讲解,并对比其性能表现。

SIFT在性能方面非常突出,在业界有很高的名气;SURF是对SIFT的改进,在提取速度方面做了优化;ORB是用于取代SIFT和SURF的简洁提取算法,提取速度比SIFT和SURF快很多。后续视觉SLAM中的ORB_SLAM框架就是基于ORB特征点的,在实时性方面表现非常出色。因此学好本节的内容,将极大降低后续视觉SLAM章节的学习难度。

本节的重点放在SIFT、SURF和ORB三种特征点提取的原理讲解中,如果对OpenCV中具体实现程序感兴趣,可以阅读OpenCV3中相应的源代码,源代码的路径如下。

  • SIFT源码路径:opencv_contrib/modules/xfeatures2d/src/sift.cpp。
  • SURF源码路径:opencv_contrib/modules/xfeatures2d/src/surf.cpp。
  • ORB源码路径:opencv/modules/features2d/src/orb.cpp。

3.4.1 SIFT特征点

SIFT是对旋转、尺度和亮度保持不变,对仿射变换、噪声等也有比较好的稳定性的图像局部特征。那什么是旋转尺度不变性呢?简单点说就是同一个物体,用相机在不同的角度和距离拍出来的图片,图片中物体的特征应该是一样的,不因图片的大小和旋转而改变。

SIFT特征提取过程,如图3-7所示。由于所有操作都在灰度图上进行,因此输入原始图需要先经过灰度转换。然后构建高斯金字塔(Gaussian Pyramids),用于表示图像的尺度空间。将高斯金字塔每组(Octave)中相邻两图层(Layer)求差值得到高斯差分金字塔(Difference of Gaussian Pyramids,DoG金字塔),用于尺度空间的极值点检测。接着通过极值点检测、特征点定位和特征点筛选操作,提取出特征点在尺度空间的位置。之后回到高斯金字塔,求取该尺度空间位置上的特征点主方向以及邻域方向。最后利用特征点的方向信息可以生产特征的描述向量,整个提取过程最后输出所有特征点的描述向量。特征点包含尺度、位置和特征描述信息,利用这些信息就可以做图像识别、图像匹配等应用了。

图3-7  SIFT特征提取过程

1.尺度空间

将单张图像利用尺度参数进行处理,得到多尺度空间的图像序列。尺度空间中的图像模糊度逐渐变大,这样能够模拟人眼由近及远观察目标时在视网膜上成像的过程。从多尺度空间的图像序列提取特征,能得到具有尺度不变性的特征。下面依次对图像金字塔、高斯金字塔和高斯差分金字塔的构建过程进行解析。

(1)图像金字塔

正如其名,图像金字塔由一张一张逐渐缩小的图片组合而成,形状就像一个金字塔。金字塔最底层放置的是原始图像,然后上一层图像由下一层图像经过1/2倍降采样得到,其实就是隔点采样,这样图像尺寸会逐渐缩小,如图3-8所示。

图3-8  图像金字塔

金字塔中含有图像的数量n可用下面的式(3-20)计算。其中rows和cols分别为原始图像的行和列数,t为金字塔顶层图像期望尺寸的对数值。也就是说已知塔顶图像的尺寸,就可以求得塔包含图像的数量。

(2)高斯金字塔

将尺度连续性考虑进来的话,还需要在图像金字塔的基础上引入高斯滤波,这就是高斯金字塔。在SIFT特征提取过程中,高斯金字塔的构建过程如图3-9所示。

图3-9  高斯金字塔

高斯金字塔中的图像有组(Octave)和层(Layer)的概念,通过组索引o和层索引s可以对塔中的每个图像建立索引。SIFT算法的提出者Lowe建议将原始灰度图扩大到2倍大小,即通过2倍升采样和高斯滤波,将扩大后的图作为塔最底层的图开始构建,这样做可以保留原图信息,增加特征点数量。同一组内的图层具有相同的大小,后一个图层由前一个图层经过尺度因子为的高斯滤波得到,也就是说同一组内递增的图层将越来越模糊。尺度因子的计算如式3-21所示,o和s分别为组索引和层索引,为初始尺度因子,在程序中为一个常数值,S是组中图层的总数量。

在不同组中,后一组的第1个图层由前一组的倒数第3个图层直接经过1/2倍降采样得到,取倒数第3个图层是为了保持下一步高斯差分金字塔的尺度空间连续性。按照这个步骤,不断构建出新的组,最终就能得到一个完整的高斯金字塔。关于金字塔的组数O、层数S等参数,请参考具体程序,这里的讲解只是举例说明。

(3)高斯差分金字塔

构建高斯差分金字塔,通过检测高斯差分金字塔的极值点,能够提取原图像中的角点特征。要讲解清楚其中的原理,需要先从拉普拉斯算子开始说起。拉普拉斯算子是n维欧式空间的一个二阶微分算子,定义为求梯度的散度,定义如式(3-22)所示。

利用拉普拉斯算子对函数求二阶导,能求出函数一阶导的极值点,也就是最大梯度点。这里先以最简单的1维空间为例,展示利用二阶导求出函数局部最大梯度点的过程,如图3-10所示。

图3-10  二阶导求最大梯度点

再来讨论2维空间的情况,也就是图像中,局部像素大梯度点是变化最明显的点,这样的点可以作为特征点。但是直接的拉普拉斯操作,非常容易受图像噪声点的干扰,于是就引入了抗干扰的高斯滤波,先进行高斯滤波,再进行拉普拉斯操作,这就是高斯拉普拉斯运算(Laplace of Gaussian,LoG)。虽然对图像做高斯拉普拉斯运算,能实现角点检测,但是运算复杂。理论证明,高斯差分函数与尺度归一化高斯拉普拉斯函数非常近似,因此可以用高斯差分运算替代高斯拉普拉斯运算来做图像角点的检测。关于近似的理论推导,如式3-23、式3-24和式3-25所示。

弄明白了高斯差分运算求图像角点,也就是局部最大梯度点。接下来就讲一下如何构建高斯差分金字塔,其实就是将高斯金字塔同组内的相邻图层做差就行了,如图3-11所示。

图3-11  高斯差分金字塔

2.特征点位置提取

特征点位置提取在高斯差分金字塔中完成,分为极值点检测、特征点定位和特征点筛选这些步骤。

(1)极值点检测

在高斯差分金字塔的同一组内,图层上的极点由该图层像素的8个领域点与上下相邻图层的9×2个领域点比较大小得到。也就是说要判断一个点是否为极值点,需要将其与周围的26个点比较大小,如图3-12所示。通过这里可以看到,要检测全尺度下的极值点,高斯差分金字塔的每个组内要多出2个图层,而高斯差分金字塔是由高斯金字塔做差得到的,那么高斯金字塔的每个组内要多出3个图层,这就是前面讲到的为什么要从倒数第3个图层来生成下一个组的原因,即为了保持高斯差分金字塔中尺度的连续性。

图3-12  极值点检测

(2)特征点定位

通过上面方法得到的是离散空间的极值点,但是离散空间的极值点并不是真正的极值点。如图3-13所示,曲线的离散采样点A、B、C、D……中,A和B分别是极大值和极小值点,但并不是曲线上真正的极值点。因此,需要利用曲线拟合的方法得到连续空间的曲线,并得到真正的极值点。这个操作在图像中是一个亚像素定位的过程,拟合过程为在极值点附近做泰勒级数展开,找出特征点更精确的位置。

图3-13  离散空间极值点

(3)特征点筛选

高斯差分算子容易产生较强的边缘响应,因此特征点还需要经过筛选,去除掉边缘点的影响。首先获取特征点位置处的Hessian矩阵H,计算如式(3-26)所示。

矩阵H的特征值ab表示xy方向的梯度。边缘点的梯度肯定是一个方向大一个方向小。因此可以设置一个阈值T,用于剔除边缘点,假设a>b,则满足a/b > T的点将被判断为边缘点而被剔除。

3.特征点方向提取

特征点方向提取在高斯金字塔中完成,分为特征点主方向、特征点邻域方向和特征描述子这些步骤。

(1)特征点主方向

经过在高斯差分金字塔中的一系列操作,提取出了特征点在尺度空间的位置信息。接下来就可以去高斯金字塔中提取该尺度空间位置处点的方向信息。首先需要提取特征点的主方向,提取过程如图3-14所示。

图3-14  特征点主方向

找到高斯金字塔中相应尺度空间的图层,在特征点位置的邻域窗口计算像素的梯度,梯度的幅值m和方向θ通过下面的式(3-27)和式(3-28)求得,其中f(x,y)为邻域窗口的像素值。

计算好梯度的幅值和方向后,将方向每10度划分一个范围,对方向进行统计,方向对应的幅度需要经过高斯系数加权后进行累计,也就是说离特征点中心越远的梯度点其幅值累计时需被乘以一个越小的加权系数。对所有方向统计完成后,就得到方向的统计直方图,直方图的横轴是方向角度,一共有36个刻度(10度,20度,...,360度),直方图的纵轴是对应方向幅值加权累计的结果。以直方图峰值的方向作为主方向,并保留大于80%峰值的方向作为辅方向,以增强鲁棒性。

(2)特征点邻域方向

要对特征点做一个好的表示,还需要用到特征点邻域上的方向。在计算邻域上的方向分布前,需要先将邻域图像按主方向进行旋转,这样邻域方向就是统一以主方向为基准来表示,以实现特征的旋转不变性,如图3-15所示。

图3-15  按主方向旋转图像

在得到的旋转不变性邻域上,进行4×4的区域划分,得到16个区域。对每个区域求方向的统计直方图,这里的直方图将方向每45度划分一个范围,也就是8个方向。方向对应的幅度同样需要经过高斯系数加权后进行累计,这里的高斯系数是以各自区域中心来计算的。

图3-16  特征点邻域方向

(3)特征描述子

从上面特征点邻域方向一共有得到了4×4×8=128个量,也就是说一个特征点可以用这个样的128维向量来描述,即描述向量。为了去除光照变化的影响,需要对描述向量做归一化。同时为了消除成像时饱和度变化的影响,需要对归一化后的描述向量做阈值化,设置一个阈值,将大于阈值的具有较大幅值的方向去除,然后再做一次归一化。最后按照特征点的尺度对描述向量进行排序。SIFT特征提取完成后,能得到一系列特征点。每个特征点包含尺度、位置和描述信息,有了这些信息就可以做图像识别、匹配之类的应用了。如图3-17所示,是从图片中提取SIFT特征的效果。

图3-17  提取SIFT特征示例

3.4.2 SURF特征点

SIFT算法最大的缺点是在一般设备上达不到实时性的要求,SURF是对SIFT的改进,在提取速度方面做了优化。SURF特征提取过程跟SIFT特征提取过程基本一样,只是在一些步骤上做了改进,以提高运行实时性。下面针对改进的地方,展开讲解。

1.尺度空间

基于高斯拉普拉斯算子检测图像角点的良好特性,在SIFT特征提取中,先创建高斯金字塔,然后再利用高斯差分运算DoG能近似高斯拉普拉斯运算LoG的性质,对高斯金字塔中的组内图层做差得到高斯斯差金字塔。也就是说SIFT中建立尺度空间的步骤包括创建高斯金字塔和创建高斯差分金字塔两步,而在创建高斯金字塔过程中,要利用不同尺度因子的高斯滤波器对图像进行滤波来得到多尺度空间。高斯滤波运算是很耗时的,所以这一步需要进行优化。

基于高斯拉普拉斯算子检测图像角点的良好特性,在SURF特征提取过程中,使用了另一种近似高斯拉普拉斯运算的方式,即基于Hessian矩阵的盒式滤波运算,能大幅降低运算耗时。下面就解析一下整个过程,高斯拉普拉斯运算的第一步是对图像I(x,y)进行高斯滤波,如式(3-29)所示。

然后对高斯滤波后的图像中的每个像素进行拉普拉斯运算,拉普拉斯运算结果用Hessian矩阵表示,如式(3-30)所示。矩阵中的元素分别是对x方向求二阶导、对x和y方向依次求偏导、对x和y方向依次求偏导和对y方向求二阶导这4个操作。

不难发现上面Hessian矩阵中4个元素的操作是关键,这4个操作分别对应在x方向求二阶导、在x和y方向依次求偏导、在x和y方向依次求偏导和在y方向求二阶导高斯滤波窗。这种滤波窗有3种形状,分别是x方向二阶导形、y方向二阶导形和x、y混合导形,如图3-18的左半部分所示。窗口中的不同亮度表不同的加权系数,可以看到这些窗口中的系数还是非常多,计算起来很耗时。解决办法是利用盒式滤波来近似这些窗,其实就是将一定区域的不同加权系数统一用某个固定值表示,如图3-18的右半部分所示,积分图像具有的性质是这样近似的理论依据。

图3-18  盒式滤波器

在利用上面盒式滤波器求出图像中每个像素的Hessian矩阵后,接着求Hessian矩阵的决定值,如公式3-31所示。

考虑到利用盒式滤波近似,可能带来的误差,这里加一个0.9的补偿系数,如公式3-32所示。

这样图像中每个Hessian矩阵的决定值就可以用于后续的极值点检测了。

与SIFT尺度空间不同的是,在SURF中金字塔的不同组的图层大小是一样的。通过在不同组上使用盒式滤波器窗口尺寸逐渐增大,同一组内的不同图层上使用相同窗口尺寸盒滤波器,但是窗口中的尺度因子取值逐渐增大,这样的方式来实现多尺度空间。

2.特征点位置提取

SIFT特征点位置是在DoG空间进行的,而SURF特征点位置是在Hessian矩阵的决定值中进行的。除了这一点区别外,极值点检测、特征点定位和特征点筛选的方式是一样的,因此就不赘述了。

3.特征点方向提取

在SIFT中,特征点主方向是通过求特征点邻域上梯度的方向统计直方图,取直方图峰值的方向。在SURF中,不求特征点邻域上梯度的方向统计直方图,而是统计特征点邻域上的Haar小波特征。统计60度扇形区域内所有x和y方向小波特征,这些特征通过高斯加权系数进行累计,即远离中心的小波特征乘上的加权系数小。然后以15度间隔旋转这个60度扇形区域,将整个圆遍历,统计最大值的那个扇形方向就是特征点主方向,如图3-19所示。

图3-19  特征点主方向

在SIFT中,先将特征点邻域按主方向旋转后,计算该邻域各个区块的梯度方向直方图,来描述特征点,描述向量是4×4×8=128维。在SURF中,不旋转领域图像,而是按主方向旋转邻域窗。以旋转之后窗的x和y方向作为Haar小波特征计算的方向,窗同样被划分成4×4的区块,每个区块含有5×5个像素,统计每个区块中5×5个像素的x方向小波特征之和、x方向小波特征绝对值之和、y方向小波特征之和、y方向小波特征绝对值之和,如图3-20所示。

图3-20 特征点邻域方向

把这4个统计值作为该区块的描述,那么描述向量是4×4×4=64维。也就是说SURF特征描述向量维度只有SIFT特征描述向量维度的一半。如图3-21所示,是从图片中提取SURF特征的效果。

图3-21  提取SURF特征示例

3.4.3 ORB特征点

学习完SIFT和SURF特征后,最后来学习ORB特征。ORB特征的最大优点是提取具有很好的实时性,按业界的说法,ORB提取速度比SURF快10倍,比SIFT快100倍。ORB提取速度能这么快,得益于其基于的FAST(Features from Accelerated Segments Test)特征和BRIEF(Binary Robust Independent Elementary Features)描述。

ORB特征提取过程,如图3-22所示。由于所有操作都在灰度图上进行,因此输入原始图需要先经过灰度转换。然后构建图像金字塔,用于表示图像的尺度空间。从这里可以看到ORB的尺度空间构建方法比SIFT和SURF简单多了,因为图像仅仅进行逐个的降采样就行了。并且构建出来的图像金字塔中各张图直接拼接成一张大图,用这张大图就能直接表示尺度空间,这样做也能大大加快速度,后面特征提取与描述都直接在这张大图上进行,以使特征具有尺度不变性。这里提取的是FAST特征,并且对FAST特征做了改进,增加了FAST特征点的旋转方向信息提取,改进后称oFAST。最后在特征点邻域内,计算BRIEF描述,并且对BRIEF描述也做了改进,借助特征点的旋转方向信息来计算BRIEF描述,改进后称rBRIEF。这里对FAST特征和BRIEF描述做出的改进,都是为了使特征点具有旋转不变性。计算完所有的oFAST和rBRIEF,就能得到所有特征点的描述向量,提取过程完成。

图3-22  ORB特征提取过程

1.尺度空间

相比于SIFT中要构建高斯金字塔和高斯差分金字塔来表示尺度空间,ORB中仅仅对图像进行逐个的降采样就行了,将构建出的图像金字塔中的各种图片拼接在一起成为一张大图,并记录好大图中每个尺度的起始和结束位置,用这张大图就能直接表示尺度空间,如图3-23所示,这样做能大大加快速度,后面特征提取与描述都直接在这张大图上进行,以使特征具有尺度不变性。

图3-23  图像金字塔的拼接表示

2.特征点提取

这里提取的是FAST特征,并且对FAST特征做了改进,增加了FAST特征点的旋转方向信息提取,改进后称oFAST。先说FAST特征的提取过程,对给定的像素点p,判断p点邻域圆周上的16个像素点中是否有连续N个点的灰度值与p点灰度值之差超过某一阈值,这个阈值一般设为p点灰度值的20%,满足这个判断的点就是FAST特征点。根据N的具体取值,FAST有几种不同的形态,常用的有FAST-12、FAST-11和FAST-9。由于这样提取的过程并没有包含特征点的旋转方向信息,为了使特征点具有旋转不变性,还要计算特征点的方向。只需要计算出邻域的灰度质心m,邻域中心p到灰度质心m的方向,就是特征点的方向,这样就得到了oFAST特征。oFAST特征提取过程,如图3-24所示。

图3-24  oFAST特征提取过程

3.特征点描述

通过上面的方法确定出oFAST特征点后,就可以在特征点邻域内,计算BRIEF描述,并且对BRIEF描述也做了改进,借助特征点的旋转方向信息来计算BRIEF描述,改进后称rBRIEF。BRIEF描述计算过程,首先对图像金字塔拼接的大图做高斯滤波,以去除掉一些高频噪声点的干扰;然后在特征点的邻域内,随机挑选两个点作为一个点对,如果点对中的第1个点亮度大于第2个点,则为这个点对分配特征值1,反之分配特征值0;按照高斯分布依次挑选256个这样的点对,最终可以得到一个256维的向量,并且向量中的每个元素只能取0或1两个值,比如V=[101001110101010111010...]这样的形式。为了使特征点描述具有旋转不变性,还要将特征点的方向考虑进来。其实很简单,只需要将BRIEF中按照高斯分布依次挑选的256个点对按特征点方向旋转,得到新的256个点对,对新的点对计算分配特征值就行了,这样就得到了rBRIEF描述。到这里,ORB特征就提取出来了。如图3-25所示,是从图片中提取ORB特征的效果。

图3-25  提取ORB特征示例

源码仓库

  • Github下载:github.com/xiihoo/Books_Robot_SLAM_Navigation

  • Gitee下载(国内访问速度快):gitee.com/xiihoo-robot/Books_Robot_SLAM_Navigation

参考文献

【1】 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

一起自学SLAM算法:3.4 图像特征点提取相关推荐

  1. Opencv图像特征点提取(

    目录 特征点分类 1 ORB ①特征点检测 ②计算特征描述 2 SIFT 1 SIFT特征检测的步骤 ①.在DOG尺度空间中获取极值点,即关键点. ②.特征点方向估计 ③生成特征描述 ④.代码实现 3 ...

  2. 图像处理之图像特征及提取

    图像处理之图像特征及提取 图像处理过程中常用的特征提取方法 图像特征: 几何特征(位置与方向.周长.面积.长轴与短轴.距离(欧式距离.曼哈顿距离.切比雪夫距离.余弦距离)): 形状特征(几何形态分析( ...

  3. 一起自学SLAM算法:9.2 LSD-SLAM算法

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

  4. 一起自学SLAM算法:7.1 SLAM发展简史

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

  5. 一起自学SLAM算法:8.3 LOAM算法

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

  6. 一起自学SLAM算法:11.2 环境感知

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

  7. 一起自学SLAM算法:8.1 Gmapping算法

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

  8. 一起自学SLAM算法:7.4 基于贝叶斯网络的状态估计

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

  9. 一起自学SLAM算法:7.7 典型SLAM算法

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

最新文章

  1. LeetCode.3-最长无重复字符子串(Longest Substring Without Repeating Characters)
  2. PhoneGap与Jquery Mobile结合开发android应用配置
  3. 转]SQLServerDBA十大必备工具
  4. spring JdbcTemplate数据库查询实例
  5. 并发数据结构-1.1 并发的数据结构的设计
  6. scrollTop的兼容性小结
  7. idea 配置maven一直停留在loading archetype list
  8. oracle 恢复坏块,Oracle 修复坏块,关掉闪回
  9. PHP中使用了mcrypt_decrypt函数处理Json Json_decode 返回空值或者 NULL 的问题 json_last_error 3...
  10. Android 10.0 去掉开机正在优化应用Dialog
  11. python相减函数subs,SUBS(subs是什么函数)
  12. 量化股票查询代码是什么?
  13. win10装win7虚拟机教程
  14. 网站已迁移、域名未转出,收到阿里云的“备案号可能被取消接入”邮件提示该怎么办。
  15. 论文推荐-计算机视觉
  16. Cesium图元管理和事件处理
  17. Enhancer和MethodInterceptor的需要导入的jar
  18. oracle rac 火星舱_火星舱备份一体机基本介绍
  19. CSS(七) css列表样式(ul)
  20. Oracle Cardinality Feedback

热门文章

  1. 真的了解Cookie吗 - Cookie详解
  2. RNN训练方法介绍-BPTT
  3. 实现素描效果---OpenCV-Python开发指南(49)
  4. 手写操作系统(1)——HelloOS
  5. 微信开发 url传参数 json 导致 ios 微信分享失败苹果手机sinature签名无效
  6. 程序员应该如何去设计需求
  7. 台式计算机售后行业标准,电脑“三包”还有待行业规范及相关法规出台
  8. 05 神经网络(NNs)
  9. 协议篇---RIP协议
  10. P2669 金币,国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十