参考:
OpenCV-Python——第26章:SIFT特征点提取算法
OpenCV-Python ORB特征匹配(实践篇)
SIFT、SURF等关键点特征提取算法代码
SIFT
#!/usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt
#读入lena图形
imgname1 = 'JingTong.jpg'
img1 = cv2.imread(imgname1)
#img1 = cv2.resize(img1,dsize=(1000,500))
#gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度处理图像
#使用opencv中封装的sift方法
sift = cv2.xfeatures2d.SIFT_create()
keyPoint, des = sift.detectAndCompute(img1,None) #keyPoint是关键点的信息,des是关键点对应的描述信息
#显示特征点数量
kp = sift.detect(img1, None)
print(kp)
print(len(kp))
#把提取到的关键点,在原图中标出
img3 = cv2.drawKeypoints(img1,keyPoint,img1,color=(0,0,255)) #画出特征点,并显示为红色圆圈
#显示
cv2.imshow("SIFT", img3)
cv2.waitKey(0)
print(des)
print(len(des))
ORB
#!/usr/bin/python
# -*- coding: utf-8 -*-
import cv2 as cv
img1 = cv.imread('JingTong.jpg')
#img2 = cv.imread('JingTong1.jpg')
#img1 = cv.resize(img1,dsize=(600,600))
#img2 = cv.resize(img1,dsize=(600,600))
# 初始化ORB
orb = cv.ORB_create()
# 寻找关键点
kp1 = orb.detect(img1)
#kp2 = orb.detect(img2)
#显示关键点数量
print(len(kp1))
#print(len(kp2))
# 计算描述符
kp1, des1 = orb.compute(img1, kp1) # 计算哪张图片的用哪张图片的关键点。
#kp2, des2 = orb.compute(img2, kp2)
# 画出关键点
outimg1 = cv.drawKeypoints(img1, keypoints=kp1, outImage=None, color=(0, 0, 255))
#outimg2 = cv.drawKeypoints(img2, keypoints=kp2, outImage=None)
print des1
# 这里是把两张图片在同一个窗口中显示。
import numpy as np
#outimg3 = np.hstack([outimg1, outimg2])
#cv.imshow("Key Points", outimg3)
cv.imshow("Key Points", outimg1)
cv.waitKey(0)
SURF
#!/usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt
imgname = 'JingTong.jpg'
src = cv2.imread(imgname)
#src = cv2.resize(src,dsize=(900,450))
surf = cv2.xfeatures2d.SURF_create()
kp, des = surf.detectAndCompute(src, None) # des是描述子
img = cv2.drawKeypoints(src, kp, src, color=(0, 255, 255))
#kp = sift.detect(gray, None)
print(kp)
print(len(kp))
#显示
cv2.imshow("SURF", img) #拼接显示为gray
cv2.waitKey(0)
#保存图像
save_path = './home/特征提取图片'
cv2.imwrite(save_path, img)
注:上面代码只是特征点提取,没有匹配。
附录:可以通过如下函数改特征点的颜色、模式等。
cv2.drawKeypoint(image, keypoints, outImage, color, flags) 解释
image:输入图像
keypoints:上面获取的特征点
outImage:输出图像
color:颜色,默认为随机颜色
flags:绘制点的模式,有以下四种模式cv2.DRAW_MATCHES_FLAGS_DEFAULT
默认值,只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
绘制特征点的时候绘制的是带有方向的圆,这种方法同时显示图像的坐标,size,和方向,是最能显示特征的一种绘制方式。
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG
只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINT
单点的特征点不被绘制