【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]颜色

展示角点.

import cv2 as cv
import numpy as np

img=cv.imread('lena.jpg')
#将图片转为灰度图并且为float32类型。
g=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
g=np.float32(g)
#获取角点,并且将角点进行膨胀处理,使其更加明显。
dst=cv.cornerHarris(g,3,3,0.04)
dst=cv.dilate(dst,None)
#筛选角点,留下大于最大角点*0.5的角点
thresh=0.5*dst.max()
img[dst>thresh]=[0,100,0]

cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()

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

 

 Shi-Tomas:

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

使用一样有三个步骤:

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

img:灰度图.

maxcorners:所需要的角点数量.

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

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

获取角点的具体坐标:

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

展示.

import cv2 as cv
import numpy as np

img=cv.imread('lena.jpg')
g=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#获取角点信息
corners=cv.goodFeaturesToTrack(g,10,0.5,3)

for i in corners:
    x,y=i.ravel()
    #将角点信息打平后获取到x和y值,因为获取到的值为浮点型,将其强制转换成整数型即可正常画圆,这个问题找了半天……
    cv.circle(img,(int(x),int(y)),10,[0,100,0])

cv.imshow("img",img)
cv.waitKey(0)
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:不绘制单点的关键点.

import cv2 as cv
import numpy as np

img=cv.imread('lena.jpg')
g=cv.cvtColor(img,cv.COLOR_BGR2GRAY)

sift=cv.xfeatures2d.SIFT_create()
kp,des=sift.detectAndCompute(g,None)
cv2.drawKeypoints(img,kp,img,[0,100,0])

cv.imshow("img",img)
cv.waitKey(0)
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进行绘制.

import cv2 as cv
import numpy as np

img=cv.imread('lena.jpg')

fast=cv.FastFeatureDetector_create(50)#阈值使用默认值10时特征点太多挡住图片了,故选用50
kp=fast.detect(img,None)#此处和前面的都不一样,仅返回一个参数,即关键点.并且可以传入彩图
cv.drawKeypoints(img,kp,img,[0,100,0])

cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()

 

 ORB:

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

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

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

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

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

import cv2 as cv
import numpy as np

img=cv.imread('lena.jpg')

orb=cv.ORB_create(100)
kp,des=orb.detectAndCompute(img,None)
cv.drawKeypoints(img,kp,img,[0,100,0])

cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值