为了账号安全,请及时绑定邮箱和手机立即绑定

ORB非常不错的目标检测算法

ORB是一种非常快速的算法,可以根据检测到的关键点生成特征向量。

ORB具有一些很好的属性,例如旋转、光照变化不变性以及抗噪性。

下面来总结下,使用ORB的关键几个步骤:

  1. 加载图片 (查看图片颜色是否正确,一般都会有把BGR转成RGB的步骤,如下图):

    https://img1.sycdn.imooc.com//5e29fda60001ee9308040612.jpg

    #非常重要的一个点: 记得要将RGB转为GRAY,方便后面使用:

    https://img1.sycdn.imooc.com//5e29fe8a0001ba8711380176.jpg

  2. 第二步:将原图与转成GRAY风格的图打出来看看:

    https://img1.sycdn.imooc.com//5e29fee10001bce710840800.jpg

    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人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消