SIFT描述子
今天群里有童鞋问说在导入OpenCV模块提取Sif描述子出错,本小子便在shell里弄了个简单的Sift特征提取演示小程序,很简单。发觉用OpenCV里Sift模块提取Sift描述子要比在图像局部描述符中用VLfeat容易多了。
自备楼梯:Rachel-Zhang一文SIFT特征提取分析
# -*- coding: utf-8 -*-
import cv2
from pylab import *
img = cv2.imread('F:/dropbox/Dropbox/translation/pcv-notebook/data/alcatraz1.jpg')
img_RGB= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# img_Gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
siftDetector=cv2.SIFT()
kp = siftDetector.detect(img_RGB,None)
kp,des = siftDetector.compute(img_RGB,kp)
# 关键点列表
print type(kp),len(kp)
# des是一个大小为关键点数目*128的数组
print type(des),des.shape
im=cv2.drawKeypoints(img_RGB,kp,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
#用pylab的imshow()显示
figure()
gray()
subplot(111)
axis('off')
imshow(im)
#用Opencv管理窗口显示
#cv2.imshow('Sift detect',im);
#cv2.waitKey(0)
#cv2.destroyAllWindows()
show()
上面验证了kp和des的大小,正如OpenCV Introduction to SIFT所说的:
Here kp will be a list of keypoints and des is a numpy array of shape Number_of_keypoints*128.
运行上面代码,对Sift描述子进行可视化:
SURF描述子
具体原理松子茶一文SURF特征提取分析讲得还比较清晰,就不重复造轮子了。
# -*- coding: utf-8 -*-
import cv2
from pylab import *
img = cv2.imread('F:/dropbox/Dropbox/translation/pcv-notebook/data/alcatraz1.jpg')
#OpenCV读取的图像默认通道为BRG
img_RGB= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
surfObj=cv2.SURF()
surfObj.hessianThreshold = 20000
#上面等价于
#surfObj=cv2.SURF(20000)
kp = surfObj.detect(img_RGB,None)
print "kp is a %s, the length of kp is %s"%(type(kp),len(kp))
kp,des = surfObj.compute(img_RGB,kp)
#可以将上面检测和计算合并在一起完成
#kp, des = surf.detectAndCompute(img_RGB,None)
img2 = cv2.drawKeypoints(img_RGB,kp,None,(255,0,255),4)
imshow(img2)
show()
运行上面代码,对SURF描述子进行可视化:
查看OpenCV版本
要查看OpenCV版本号,可以在Python Shell里输入下面命令:
from cv2 import __version__
__version__
Reference:
[1]. Introduction to SIFT (Scale-Invariant Feature Transform)
[2]. Introduction to SURF