• 【OpenCV】角点检测、特征点提取(Harris、Shi-Tomas、SIFT、SURF、FAST、ORB)学习笔记


    角点检测:

    Harris:

    使用有三步骤:

    检测角点:dst=cv2.cornerHarris(imgblockSizeksizek)

    img:要为float32类型的单通道图.

    blockSize:角点检测时考虑的领域大小

    ksize:检测时用的核的大小

    k:一个参数(不懂干什么的)范围在0.04到0.06之间.

    筛选角点:img[dst>自己设定的阈值]=[B,G,R]颜色

    展示角点.

    1. import cv2 as cv
    2. import numpy as np
    3. img=cv.imread('lena.jpg')
    4. #将图片转为灰度图并且为float32类型。
    5. g=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    6. g=np.float32(g)
    7. #获取角点,并且将角点进行膨胀处理,使其更加明显。
    8. dst=cv.cornerHarris(g,3,3,0.04)
    9. dst=cv.dilate(dst,None)
    10. #筛选角点,留下大于最大角点*0.5的角点
    11. thresh=0.5*dst.max()
    12. img[dst>thresh]=[0,100,0]
    13. cv.imshow("img",img)
    14. cv.waitKey(0)
    15. cv.destroyAllWindows()

    阈值设高了,角点较少,可以考虑降低阈值。

     

     Shi-Tomas:

    比较harris,对角点更加敏感,效果更好.二者都具有旋转不变性(图片旋转后仍然能检测),但不具备尺度不变性.(图片放大或缩小可能就检测不到角点了)

    使用一样有三个步骤:

    获取角点:corners=cv.goodFeaturesToTrack(img,maxcorners,qualitylevel,minDistance)

    img:灰度图.

    maxcorners:所需要的角点数量.

    qualitylevel:最低可接受的角点质量水平,范围在0到1之间.

    minDistance:角点之间的最小距离,即距离小于该值的两点会被判定为同一个点.

    获取角点的具体坐标:

    获取的corners可用numpy的ravel来将其打平成一维数组,其中一个元素包含x和y值.

    展示.

    1. import cv2 as cv
    2. import numpy as np
    3. img=cv.imread('lena.jpg')
    4. g=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    5. #获取角点信息
    6. corners=cv.goodFeaturesToTrack(g,10,0.5,3)
    7. for i in corners:
    8. x,y=i.ravel()
    9. #将角点信息打平后获取到x和y值,因为获取到的值为浮点型,将其强制转换成整数型即可正常画圆,这个问题找了半天……
    10. cv.circle(img,(int(x),int(y)),10,[0,100,0])
    11. cv.imshow("img",img)
    12. cv.waitKey(0)
    13. cv.destroyAllWindows()

     

     特征点提取:

     SIFT:

    实例化SIFT特征检测器:sift=cv2.xfeatures2d.SIFT_create( )

    获取关键点:keypoints,des=sift.detectAndCompute(img,None)

    img:灰度图.

    绘制关键点:cv2.drawKeypoints(img,keypoints,outputimg,color,flags=)

    keypoints:即上面获取到的.

    outputimg:输出的图像

    flags:有四种方法

    cv2.DRAW_MATCHES_FLAGS_DEFAULT(默认):创建输出矩阵,只绘制每个关键点的中间点.

    cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:和第一个一样,只不过不创建输出矩阵.

    cv2.DRAW_MATCHES_FLAGS_DRAW_RICHKEYPOINTS:对每个特征点绘制大小的方向(向量)

    cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINT:不绘制单点的关键点.

    1. import cv2 as cv
    2. import numpy as np
    3. img=cv.imread('lena.jpg')
    4. g=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    5. sift=cv.xfeatures2d.SIFT_create()
    6. kp,des=sift.detectAndCompute(g,None)
    7. cv2.drawKeypoints(img,kp,img,[0,100,0])
    8. cv.imshow("img",img)
    9. cv.waitKey(0)
    10. cv.destroyAllWindows()

     

    SURF: 

     用法与上面的SIFT一致,只不过创建特征点检测器的API不一样

    surf=cv2.xfeatures2d.SURF_create( )

     由于该算法受专利保护,我用不了,那就不展示了.

    FAST:

    实例化FAST特征点检测器:fast=cv2.FastFeatureDetector_create(threshold,nonmaxSuppression)

    threshold:阈值,默认为10.

    nonmaxSuppression:是否进行极大值抑制,默认为True.

    检测关键点:kp=fast.detect(img,None)

    绘制关键点:使用cv2.drawKeypoints进行绘制.

    1. import cv2 as cv
    2. import numpy as np
    3. img=cv.imread('lena.jpg')
    4. fast=cv.FastFeatureDetector_create(50)#阈值使用默认值10时特征点太多挡住图片了,故选用50
    5. kp=fast.detect(img,None)#此处和前面的都不一样,仅返回一个参数,即关键点.并且可以传入彩图
    6. cv.drawKeypoints(img,kp,img,[0,100,0])
    7. cv.imshow("img",img)
    8. cv.waitKey(0)
    9. cv.destroyAllWindows()

     

     ORB:

    结合了fast算法和brief算法,具有尺度不变性和旋转不变性.

    实例化ORB特征点检测器:orb=cv2.ORB_create(nfeatures)

    nfeatures:所需特征点的最大数量

    检测关键点:kp,des=orb.detectAndCompute(img,None)

    绘制关键点:使用cv2.drawKeypoints进行绘制.

    1. import cv2 as cv
    2. import numpy as np
    3. img=cv.imread('lena.jpg')
    4. orb=cv.ORB_create(100)
    5. kp,des=orb.detectAndCompute(img,None)
    6. cv.drawKeypoints(img,kp,img,[0,100,0])
    7. cv.imshow("img",img)
    8. cv.waitKey(0)
    9. cv.destroyAllWindows()

     

  • 相关阅读:
    安卓面经_anroid面经_111道安卓基础面试题全解析
    python 将字节字符串转换成十六进制字符串
    袋鼠云思枢:数驹DTengine,助力企业构建高效的流批一体数据湖计算平台
    对未知程序所创建的 PDF 文档的折叠书签层级全展开导致丢签的一种解决方法
    2022-09-18 mysql-subselect相关执行流程记录
    阿里云郑大禹:云上应用构建的三大挑战与解决之道
    java计算机毕业设计HTML5互动游戏新闻网站设计与实现源码+mysql数据库+系统+lw文档+部署
    51单片机汽车胎压大气气压测量仪仿真设计_数码管显示(代码+仿真+设计报告+讲解)
    App Store和Google Play之间的关键区别
    Python爬虫教程:如何爬取教育漏洞报告平台中的漏洞报告?
  • 原文地址:https://blog.csdn.net/m0_63235356/article/details/125547399