特征检测

图像的特征是指图像中具有独特性和易于识别性的区域,角、边缘等都属于有意义的特征。

8.1角检测

角是两条边的交点,也可称为角点或拐角,它是图像中各个方向上强度变化最大的区域。
OpenCV的cv2.cornerHarris()、cv2.cornerSubPix()和cv2.goodFeaturesToTrack()函数用于角检测。

8.1.1哈里斯角检测

cv2.cornerHarris()函数根据哈里斯角检测器算法检测图像中的角,其基本格式如下。

dst=cv2.cornerHarris(src,blockSize,ksize,k)

参数说明如下。

  • dst是返回结果,它是一个numpy.ndarray对象,大小和src相同,每一个数组元素对应着一个像素点,其值越大,对应像素点是角的概率越高。
  • src为8位单通道或浮点值图像。
  • blockSize为领域大小,值越大,检测出的角占的区域越大。
  • ksize为哈里斯角检测器使用的Sobel算子的中孔参数。
  • k为哈里斯角检测器的自由参数。ksize和k影响检测的敏感度,值越小,检测出的角越多,但检测准确率越低。
    实例代码如下。
#哈里斯角检测
import cv2
import numpy as np
img=cv2.imread('cube.jpg')#打开输入图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度图像
gray=np.float32(gray)#转换为浮点类型
dst=cv2.cornerHarris(gray,8,7,0.01)#执行角检测
#将检测结果中值大于“最大值*0.02”对应的像素设置为红色
img[dst>0.02*dst.max()]=[0,0,255]
cv2.imshow('dst',img)#显示检测结果
cv2.waitKey(0)

原图像

结果图像如下。红点位置为检测出的角的位置。

8.1.2优化哈里斯角

使用cv2.cornerHarris()函数检测出的角称为哈里斯角,它包含了一定数量的像素。有时,可能需要对哈里斯角进行进一步处理,找出角的更精确位置。
cv2.cornerSubPix()函数用于哈里斯角进行优化,找出更精确的角的位置,其基本格式如下。

dst=cv2.cornerSubPix(src,corners,winSize,zeroZone,criteria)

参数说明如下。

  • dst为返回结果,存储优化后的角信息。
  • src为8位单通道或浮点值图像。
  • corners为哈里斯角的质心坐标。
  • winSize为搜索窗口边长的一半。
  • zeroZone为零值边长的一半。
  • criteria为优化查找的终止条件。

实例代码如下。

#优化哈里斯角
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('cube.jpg')#打开图像,默认为BGR格式
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度图像
gray=np.float32(gray)#转换为浮点类型
dst=cv2.cornerHarris(gray,8,7,0.04)#查找哈里斯角
r,dst=cv2.threshold(dst,0.01*dst.max(),255,0)#二值化阈值处理
dst=np.uint8(dst)#转换为整型
r,l,s,cxys=cv2.connectedComponentsWithStats(dst)#查找质点坐标
cif=(cv2.TermCriteria_EPS+cv2.TermCriteria_MAX_ITER,100,0.001)#定义优化查找条件
corners=cv2.cornerSubPix(gray,np.float32(cxys),(5,5),(-1,1),cif)#执行优化查找
res=np.hstack((cxys,corners))#堆叠构造新数组,便于标注角
res=np.int0(res)#构造为整型
img[res[:,1],res[:,0]]=[0,0,255]#将哈里斯角对应像素设置为红色
img[res[:,3],res[:,2]]=[0,255,0]#将优化结果像素设置为绿色
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#转换为RGB格式
plt.imshow(img)
plt.axis('off')
plt.show()#显示检测结果

下图是使用工具中的缩放功能放大图像后立方体的一个角,可看出红色和绿色角位置。

8.1.3 Shi-Tomasi角检测

Shi-Tomasi角检测是在哈里斯角检测基础上提出的改进角检测的方法。
OpenCV的cv.goodFeaturesToTrack()函数使用Shi-Tomasi角检测器查找图像的N个最强角,其基本格式如下。

dst=cv2.goodFeaturesToTrack(src,maxCorners,qualityLevel,minDistance)

参数说明如下。

  • dst为返回结果,保存了检测到的角在原图像中的坐标。
  • src为8位单通道或浮点值图像。
  • maxCorners为返回的角的最大数量。
  • qualityLevel为可接受的角的最低质量。
  • minDistance为返回的角之间的最小欧几里得距离。
    实例代码如下。
#Shi-Tomasi角检测
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('five.jpg')#打开图像,默认为BGR格式
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度图像
gray=np.float32(gray)#转换为浮点类型
corners=cv2.goodFeaturesToTrack(gray,6,0.1,100)#检测角,最多6个
corners=np.int0(corners)#转换为整型
for i in corners:x,y=i.ravel()cv2.circle(img,(x,y),4,(0,0,255),-1)#用红色圆点标注找到的角
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#转换为RGB格式
plt.imshow(img)
plt.axis('off')
plt.show()#显示检测结果

结果图像如图所示。

8.2特征点检测

特征点是图像中具有唯一性的像素,也称兴趣点或者关键点。角是特殊的特征点。

8.2.1 FAST特征检测

FAST特征检测器主要根据像素周围16个像素的强度和阈值等参数来判断像素是否为关键点。
可调用cv2.FastFeatureDetector_create()函数创建一个FAST对象 ,然后调用FAST对象的detect()方法执行关键点检测,该方法将返回一个关键点列表。每个关键点对象包含了关键点的强度、坐标、响应强度和邻域大小等信息。
示例代码如下。

#FAST关键点检测
import cv2
img=cv2.imread('cube.jpg')#打开图像,默认为BGR格式
fast=cv2.FastFeatureDetector_create()#创建FAST检测器
kp=fast.detect(img,None)#检测关键点,不用掩模
img2=cv2.drawKeypoints(img,kp,None,color=(0,0,255))#绘制关键点
cv2.imshow('FAST points',img2)#显示绘制了关键点的图像
fast.setThreshold(20)#设置阈值,默认阈值为1
0
kp=fast.detect(img,None)#检测关键点,不使用掩模
n=0
for p in kp:print("第%s个关键点,坐标:"%(n+1),p.pt,'响应强度:',p.response,'邻域大小:',p.size,'角度:',p.angle)n+=1
img3=cv2.drawKeypoints(img,kp,None,color=(0,0,255))
cv2.imshow('Threshold20',img3)#显示绘制了关键点的图像
cv2.waitKey(0)

程序运行结果如图所示,左图显示FAST对象使用阈值(10)时检测到的关键点,右图是阈值设置为20时检测的关键点。
阈值越大,返回的关键点越少。

程序输出了阈值为20后的关键点信息,如下所示。

FAST算法返回的关键点的响应强度值代表了该点属于角的频率,响应强度越大,该点越有可能属于角。

8.2.2 SIFT特征检测

图像中的角具有旋转不变特征,即旋转图像时角不会发生变化;但在放大或者缩小图像时,角可能发生变化。
SIFT是指尺度不变特征变换,SIFT算法用于查找图像中的尺度不变特征,返回图像中的关键点。
OpenCV提供的cv2.SIFT_create()函数用于创建SIFT对象,然后调用SIFT对象的detect()方法执行SIFT算法检测关键点。
示例代码如下。

#SIFT关键点检测
import cv2
import matplotlib.pyplot as plt
img=cv2.imread('five.jpg')#打开图像,默认为BGR格式
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度图像
sift=cv2.SIFT_create()#创建SIFT检测器
kp=sift.detect(gray,None)#检测关键点
img2=cv2.drawKeypoints(img,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)#绘制关键点
img2=cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)#转换为RGB图像
plt.imshow(img2)
plt.axis('off')
plt.show()#显示绘制了关键点的图像

程序运行结果如下。

在绘制关键点时,将cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS设置为drawKeypoints()函数的flags参数时,可以根据响应强度值在关键点位置绘制大小不同的圆,并可同时标注方向。

8.2.3 ORB特征检测

ORB特征检测以FAST特征检测器和BRIEF描述符为基础进行了改进,以获得更好的特征检测性能。OpenCV提供的cv2.ORB_create()函数用于创建ORB对象,然后调用ORB对象的detect()方法进行ORB算法检测关键点。
实例代码如下。

#ORB关键点检测
import cv2
img=cv2.imread('cube.jpg')
orb=cv2.ORB_create()#创建ORB检测器
kp=orb.detect(img,None)#检测关键点
img2=cv2.drawKeypoints(img,kp,None,color=(0,0,255))#绘制关键点
cv2.imshow('ORB',img2)
cv2.waitKey(0)

程序运行结果如下图。

8.3 特征匹配

获得图像的关键点后,可通过计算得到关键点的描述符。关键点描述符可用于图像的特征匹配。通常,在计算图A是否包含图B的特征区域时,将图A称为训练图像,将图B称为查询图像。图A的关键点描述符称为训练描述符,图B的关键点描述符称为查询描述符。

8.3.1 暴力匹配器

暴力匹配器使用描述符进行特征比较。在比较时,暴力匹配器首先在查询描述符中取一个关键点的描述符,将其与训练描述符中的所有关键点描述符进行比较,每次比较会给出一个距离值,距离最小的值对应最佳匹配结果。所有描述符比较完后,匹配返回结果列表。
OpenCV的cv2.BFMatcher_create()函数用于创建暴力匹配器,其基本格式如下。

bf=cv2.BFMatcher_create([normType[,crossCheck]])

参数说明如下。

  • bf为返回的暴力匹配器对象。
  • normType为距离检测类型,默认为cv2.NORM_L2。通常,SIFT、SURF等描述符使用cv2.NORM_L1或cv2.NORM_L2,ORB、BRISK或BRIEF等描述符使用cv2.NORM_HAMMING。
  • crossCheck默认为False,匹配器为每个查询描述符找到k个距离最近的匹配描述符。crossCheck为True时,只返回满足交叉验证条件的匹配结果。
    暴力匹配器对象的match()方法返回每个关键点的最佳匹配结果,其基本格式如下。
ms=bf.match(des1,des2)

参数说明如下。

  • ms为返回的匹配结果,它是一个DMatch对象列表。每个DMatch对象表示关键点的一个匹配结果,其distance属性表示距离,值越小匹配度越高。
  • des1为查询描述符。
  • des2为训练描述符。
    获得匹配结果后,可调用cv2.drawMatches()或cv2.drawMatchesKnn()函数绘制匹配结果图像,其基本格式如下。
outImg=cv2.drawMatches(img1,keypoints1,img2,keypoints2,matches1to2,outImg[,matchColor[,singlePointColor[,matchesMask[,flags]]]])
outImg=cv2.drawMatchesKnn(img1,keypoints1,img2,keypoints2,matches1to2,outImg[,matchColor[,singlePointColor[,matchesMask[,flags]]]])

参数说明如下。

  • outImg为返回的绘制结果图像,图像中查询图像与训练图像中匹配的关键点和两点之间的连线为彩线。
  • img1为查询图像。
  • keypoints1为img1的关键点。
  • img2为训练图像。
  • keypoints2为img2的关键点。
  • matches1to2为img1与img2的匹配结果。
  • matchColor为关键点和连接线的颜色,默认使用随机颜色。
  • singlePointColor为单个关键点的颜色,默认使用随机颜色。
  • matchesMask为掩模,用于决定绘制哪些匹配结果,默认为空,表示绘制所有匹配结果。
  • flags为标志,可设置为下列参数值。
    cv2.DrawMatchesFlags_DEFAULT:默认方式,绘制两个图像源、匹配项和单个关键点,没有围绕关键点的圆以及关键点的大小和方向。
    cv2.DrawMatchesFlags_DRAW_OVER_OUTIMG:根据输出图像的现有内容进行绘制。
    cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS:不会绘制单个关键点。
    cv2.DrawMatchesFlags_DRAW_RICH_KEYPOINTS:在关键点周围绘制具有关键点大小和方向的圆圈。
    示例代码如下。
#暴力匹配器、ORB描述符和match()方法匹配
import cv2
import matplotlib.pyplot as plt
img1=cv2.imread('shu1.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
img2=cv2.imread('shu3.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
orb=cv2.ORB_create()#创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)#检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)#检测关键点和计算描述符
bf=cv2.BFMatcher_create(cv2.NORM_HAMMING,crossCheck=True)#创建匹配器
ms=bf.match(des1,des2)#执行特征匹配
ms=sorted(ms,key=lambda x:x.distance)#按距离排序
img3=cv2.drawMatches(img1,kp1,img2,kp2,ms[:20],None,flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)#绘制前20个匹配结果
plt.imshow(img3)
plt.axis('off')
plt.show()

程序运行结果如下。

暴力匹配器对象的KnnMatch()方法可返回指定数量的最佳匹配结果,其基本格式如下。

ms=bf.knnMatch(des1,des2,k=n)

参数说明如下。

  • ms为返回的匹配结果列表,每个列表元素是一个子列表,它包含了由参数k指定个数的DMatch对象。
  • des1为查询描述符。
  • des2为训练描述符。
  • k为返回的最佳匹配个数。
    示例代码如下。
#暴力匹配器、ORB描述符和knnMatch()方法匹配
import cv2
import matplotlib.pyplot as plt
img1=cv2.imread('shu1.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
img2=cv2.imread('shu3.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
orb=cv2.ORB_create()#创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)#检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)#检测关键点和计算描述符
bf=cv2.BFMatcher_create(cv2.NORM_HAMMING,crossCheck=False)#创建匹配器
ms=bf.knnMatch(des1,des2,k=2)#应用比例测试选择要使用的匹配结果
good=[]
for m,n in ms:if m.distance < 0.75*n.distance:good.append(m)
img3=cv2.drawMatches(img1,kp1,img2,kp2,good[:20],None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)#绘制前20个匹配结果
plt.imshow(img3)
plt.axis('off')
plt.show()

结果如下图。

8.3.2 FLANN匹配器

FLANN为近似最近邻的快速库,FLANN特征匹配算法比其他的最近邻算法更快。
在创建FLANN匹配器时,需要传递两个字典参数:index_params和search_params。
index_params用于指定索引树的算法类型和数量。SIFT和SURF可使用下面代码来设置。

FLANN_INDEX_KDTREE=1
index_params=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)

ORB算法可使用下面代码来设置。

FLANN_INDEX_LSH=6
index_params=dict(algorithm=FLANN_INDEX_LSH,table_number=6,key_size=12,multi_probe_level=1)

search_params用于指定索引树的遍历次数,遍历次数越多,匹配结果越精确,通常设置为50即可,如下所示。

search_params=dict(checks=50)

实例代码如下。

#FLANN匹配
import cv2
import matplotlib.pyplot as plt
img1=cv2.imread('shu1.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
img2=cv2.imread('shu3.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
orb=cv2.ORB_create()#创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)#检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)#检测关键点和计算描述符
#定义FLANN参数
FLANN_INDEX_LSH=6
index_params=dict(algorithm=FLANN_INDEX_LSH,table_number=6,key_size=12,multi_probe_level=1)
search_params=dict(checks=50)
flann=cv2.FlannBasedMatcher(index_params,search_params)#创建FLANN匹配器
matches=flann.match(des1,des2)#执行匹配操作
draw_params=dict(matchColor=(0,255,0),singlePointColor=(255,0,0),#设置单个点为红色matchesMask=None,flags=cv2.DrawMatchesFlags_DEFAULT)
img3=cv2.drawMatches(img1,kp1,img2,kp2,matches[:20],None,**draw_params)
plt.imshow(img3)
plt.axis('off')
plt.show()

结果如下。

8.4对象查找

经过特征匹配后,可找到查询图像在训练图像中的最佳匹配,从而可在训练图像中精确查找到查询图像。获得最佳图像后,调用cv2.findHomegraphy()函数来执行查询图像和训练图像的透视变换,可获得查询图像在训练图像中的位置。
cv2.findHomography()函数的基本格式如下。

retv,mask=cv2.findHomography(srcPoints,dstPoints[,method[,
ransacReprojThreshold]])

参数说明如下。

  • retv为返回的转换矩阵。
  • mask为返回的查询图像在训练图像中的最佳匹配结果掩模。
  • srcPoints为查询图像匹配结果的坐标。
  • dstPoints为用于计算透视转换矩阵的方法。
  • ransacReprojThreshold为可允许的最大重投影误差。
    cv2.perspectiveTransform()函数的基本格式如下。
dst=cv2.perspectiveTransform(src,m)

参数说明如下。

  • src为输入的2通道或3通道浮点类型的数组。
  • m是大小为3X3或4X4的浮点类型的转换矩阵,如使用cv2.findHomography()函数返回的转换矩阵。
  • dst为输出结果数组,大小和类型与src相同。
    示例代码如下。
#对象查找
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('shu1.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
img2=cv2.imread('shu3.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
orb=cv2.ORB_create()#创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)#检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)#检测关键点和计算描述符
bf=cv2.BFMatcher_create(cv2.NORM_HAMMING,crossCheck=True)#创建匹配器
ms=bf.match(des1,des2)#执行特征匹配
ms=sorted(ms,key=lambda x:x.distance)#按距离排序
matchesMask=None
if len(ms)>10:#在有足够数量的匹配结果后,才计算查询在训练图像中的位置#计算查询图像匹配结果的坐标querypts=np.float32([kp1[m.queryIdx].pt for m in ms]).reshape(-1,1,2)#计算训练图像匹配结果的坐标trainpts = np.float32([kp1[m.queryIdx].pt for m in ms]).reshape(-1, 1, 2)#执行查询图像和训练图像的透视变换retv,mask=cv2.findHomography(querypts,trainpts,cv2.RANSAC)#计算最佳匹配结果的掩模,用于绘制匹配结果matchesMask=mask.ravel().tolist()h,w=img1.shapepts=np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2)#执行向量的透视矩阵变换,获得查询图像在图像中的位置dst=cv2.perspectiveTransform(pts,retv)#用白色矩形在训练图像中绘制出查询图像的范围img2=cv2.polylines(img2,[np.int32(dst)],True,(255,255,255),5)
img3=cv2.cv2.drawMatches(img1,kp1,img2,kp2,ms,None,matchColor=(0,255,0),singlePointColor=None,matchesMask=matchesMask,flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3)
plt.axis('off')
plt.show()

结果如下图。

只有在满足足够多的匹配结果后,才能确定查询图像在训练图像中的位置,所以if语句数量设置为10。满足条件后,根据特征匹配结果执行透视变换,获得查询图像在训练图像中的位置,再用绘图函数绘制出位置。未满足条件时,本例只绘制特征匹配的结果,不会绘制位置。

OpenCV特征检测,角检测,特征点检测,特征匹配,对象查找相关推荐

  1. 【OpenCV-Python】28.OpenCV的特征检测——特征点检测

    28.OpenCV的特征检测--特征点检测 文章目录 前言 一.FAST特征检测 二.SIFT特征检测 三.ORB特征检测 四.OpenCV-Python资源下载 总结 前言   特征点是图像中具有唯 ...

  2. OpenCV之feature2d 模块. 2D特征框架(1)Harris 角点检测子 Shi-Tomasi角点检测子 定制化创建角点检测子 亚像素级的角点检测 特征点检测

    Harris 角点检测子 目标 本教程中我们将涉及: 有哪些特征?它们有什么用? 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点. 理论 有哪些特征? 在计算机视 ...

  3. android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio

    实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...

  4. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  5. 角点检测——发现图像的特征

    文章目录 写在最前 角点检测是什么?有什么用? OpenCV中的角点检测 Harris角点检测 Shi-Tomasi 角点检测 特征检测,从ORB说起 写在最后 往期文章 下载 写在最前 不知不觉,漫 ...

  6. OpenCV —— 特征点检测之 SIFT 特征检测器

    SIFT 原理详解 尺度空间的表示 高斯金字塔的构建 高斯差分金字塔 空间极值点检测 尺度变化的连续性 特征点定位 特征点的精确定位 剔除不稳定的边缘响应点 特征点方向赋值 生成特征描述 SIFT的缺 ...

  7. 【特征检测】FAST特征点检测算法

    简介 在局部特征点检测快速发展的时候,人们对于特征的认识也越来越深入,近几年来许多学者提出了许许多多的特征检测算法及其改进算法,在众多的特征提取算法中,不乏涌现出佼佼者. 从最早期的Moravec,到 ...

  8. 十.OpenCv 特征点检测和匹配

    特征点检测和匹配 1. 特征检测的基本概念 特征检测是计算机视觉和图像处理中的一个概念.它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征.特征检测的结果是把图像上的点分为不同的子集 ...

  9. 【OpenCV学习】(十)特征点检测与匹配

    [OpenCV学习](十)特征点检测与匹配 背景 提取图像的特征点是图像领域中的关键任务,不管在传统还是在深度学习的领域中,特征代表着图像的信息,对于分类.检测任务都是至关重要的: 特征点应用的一些场 ...

最新文章

  1. linux shell (()) 双括号运算符使用
  2. 前端基础(一):js数据类型
  3. 手机 跑linux,你可曾想过在iOS上跑Linux?
  4. BOOST_VMD_GET_TYPE宏相关的测试程序
  5. 第十八期:网页禁止复制粘贴怎么办?教你六招轻松搞定
  6. XCopy命令实现增量备份
  7. postgreSQL数据库默认用户postgres常用命令
  8. 基本操作2-常用命令
  9. 数据分析之matplotlib和numpy的应用
  10. 显示器点距 测试软件,大既是正义!最佳文本显示点距~AOC LV323HQPX显示器开箱
  11. 浏览器API 文字转语音
  12. 【算法:leetcode】双指针:142. 环形链表 II 633. 平方数之和
  13. Landsat卫星数据标识
  14. PHP微信根据订单号查询支付结果,9. PHP接入微信支付订单、退款订单、转款订单的查询...
  15. php撤回一步,PS怎么撤回很多步
  16. 什么是GEMM?该怎么去学习GEMM?
  17. web前端优化10点总结
  18. 180828 逆向-网鼎杯(3-2)
  19. 最好的WordPress搜索引擎优化技巧,你应该完全尝试
  20. C#“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”

热门文章

  1. 联想电脑 linux BIOS,联想电脑bios怎么设置
  2. 运维——Docker网络
  3. rtklib单点定位
  4. Twitter推出名为“Gizzard”的分布式数据存储框架
  5. MySQL超过800G的大表优化方案
  6. 微软语音合成网页版源码,影视解说配音网页版
  7. Visio常见使用问题整理(不断更新中)
  8. SAP寄售采购订单退货
  9. 【机器人】多传感器融合定位前沿技术小笔记
  10. 算法:动态规划经典题目