ORB是一种非常快速的算法,可以根据检测到的关键点生成特征向量。
ORB具有一些很好的属性,例如旋转、光照变化不变性以及抗噪性。
下面来总结下,使用ORB的关键几个步骤:
加载图片 (查看图片颜色是否正确,一般都会有把BGR转成RGB的步骤,如下图):
#非常重要的一个点: 记得要将RGB转为GRAY,方便后面使用:
第二步:将原图与转成GRAY风格的图打出来看看:
3. 定位关键点:
ORB算法的第一步是定位关键点。找到关键点后,ORB会创建相应的二进制特征向量 ,并在ORB描述算子中将他们组合在一起。
我们要使用cv.ORB_create()函数来设置ORB的算法参数,一般的参数类型如下:
cv2.ORB_create(nfeatures = 500,scaleFactor=1.2,nlevels=8,edgeThreshold = 31,fistLevel =0,WTA_K=2, score_type = HARRIS_SCORE,patchSize = 31,fastThreshold=20) """ 参数解释: nfeatures : 确定想要定位的特征,即关键点的最大数量。(int) scaleFactor :金字塔抽取比例必须大于1 。ORB会使用图像金字塔来查找特征,因此必须提供,金字塔中每个层 与金字塔所具有的级别数之间的比例因子。`scaleFactor = 2`表示经典金字塔, 其中每个下一级别的像素比前一级少4倍。大比例因子将会减少检测到的特征数量。 nlevels:金字塔等级的数量。 最小级别的线性大小等于input_image_linear_size / pow(scaleFactor,nlevels)。 edgeThreshold:未检测到特征的边缘大小。 由于关键点具有特定的像素大小,因此必须从搜索中排除图像的边缘。 `edgeThreshold`的大小应等于或大于patchSize参数。 fistLevel :此参数用于确定应将哪个级别当做金字塔中的第一级别。 它在当前实现中应为0。通常情况下,具有统一标度的金字塔等级被认为是第一级。 WTA_K: 用于生成定向BRIEF描述子的每个元素的随机像素的数量。 可能的值为2、3和4,其中2为默认值。 例如,值3意味着一次选择三个随机像素来比较它们的亮度, 并返回最亮像素的索引。由于有3个像素,因此返回的索引将为0、1或2。 score_type :此参数可以设置为HARRIS_SCORE或FAST_SCORE。 默认的HARRIS_SCORE表示Harris角点算法用于对特征进行排名。 该分数仅用于保留最佳特征。 FAST_SCORE生成的关键点稳定性稍差,但计算起来要快一些。 patchSize :定向BRIEF描述子使用的补丁的大小。在较小的金字塔层级上,由特征覆盖的感知图像区域将更大。 我们可以看到,`cv2. ORB_create()`函数支持各种参数。 前两个参数(`nfeatures` and ` scaleFactor`)最有可能需要更改。 其他参数只要保留其默认值,就可以获得不错的结果。 在下面的代码中,我们将使用`ORB_create()`函数将我们想要检测的关键点的最大数量设置为200, 并将金字塔抽取比率设置为2.1。 然后,使用` .detectAndCompute (image)`方法定位给定训练`image`中的关键点并计算其对应的ORB描述子。 最后,使用` cv2.drawKeypoints()`函数把ORB算法找到的关键点可视化。 """ # Import copy to make copies of the training image import copy # Set the default figure size plt.rcParams['figure.figsize']=[20,10] # Set the parameters of the ORB algorithm #by specifying the maximum number of keypoints to locate and # the pyramid decimation ratio orb = cv2.ORB_create(200,2.0) # Find the keypoints in the gray scale training image #and compute their ORB descriptor. # The None parameter is needed to indicate that we are not using a mask. keypoints,descriptors = orb.detectAndCompute(training_image,None) # Draw the keypoints with size and orientation on the other copy of the training imagecv2.drawKeypoints(training_image, keypoints, keyp_with_size, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.drawKeypoints(training_image, keypoints, keyp_without_size, color = (0, 255, 0)) # Draw the keypoints with size and orientation on the other copy of the training image cv2.drawKeypoints(training_image, keypoints, keyp_with_size, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) # Display the image with the keypoints without size or orientation plt.subplot(121)plt.title('Keypoints Without Size or Orientation') plt.imshow(keyp_without_size) # Display the image with the keypoints with size and orientationplt.subplot(122) plt.title('Keypoints With Size and Orientation') plt.imshow(keyp_with_size)plt.show()
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦