SIFT, ORB, SURF 特征提取

参考:

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)

注:上面代码只是特征点提取,没有匹配。

通常,SIFT 算法的帧率最低 但是匹配对的数量最高。 ORB 算法虽然运行速度很快 但是匹配精度低, 不适用于图像匹配 SURF 算法在帧率和匹配对的数量上都比较中等。 综合起来 ,SURF 算法更加适用于图像的提取与匹配。

附录:可以通过如下函数改特征点的颜色、模式等。

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

         单点的特征点不被绘制

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值