【CV学习4】OpenCV-Python: SIFT Demo one
# -*-coding:utf-8-*- #author: lyp time: 2018/7/31 import cv2 import numpy as np img = cv2.imread('SLAM DUNK.jpg') grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图像 sift = cv2.xfeatures2d.SIFT_create() # 用SIFT类来创建一个SIFT对象 kp = sift.detect(grayImg, None) # 检测关键点 _, des = sift.compute(grayImg, kp) # 计算关键点描述 cv2.drawKeypoints(img, kp, img) # 根据关键点和描述画出关键点 cv2.imshow('Key Points', img) cv2.waitKey() cv2.destroyAllWindows()
0.前言
从OpenCV3 开始,SIFT之类的算法已经移除了release,转而放到了contrib的xfeatures里,所以在进行本章及其以后的编程时候,需要先卸载之前安装的Opencv-python版本(如果你是跟着我之前博客里面的话,就没必要卸载啦),然后运行pip install opencv-contrib-python==3.3.1.11。具体步骤可以参考https://www.cnblogs.com/gfgwxw/p/9309920.html
1. 程序详解
a. 创建一个SIFT的对象
retval=cv2.xfeatures2d.SIFT_create([, nfeatures[, nOctaveLayers[, contrastThreshold[, edgeThreshold[, sigma]]]]])
b.检测关键点
keypoints=cv2.Feature2D.detect(image[, mask])
image: 源图像
mask:掩膜
keypoints: 关键点向量
c.计算关键点的描述
keypoints, descriptors=cv2.Feature2D.compute(image, keypoints[, descriptors])
keypoints: 已知的关键点向量
descriptors:关键点描述向量
d.根据关键点和描述画出关键点
outImage=cv2.drawKeypoints(image, keypoints, outImage[, color[, flags]])
outImage: 输出图像,画好的那种
image: 源图像
keypoints: 关键点向量
color: 颜色
flags: 各种属性值
cv2.DRAW_MATCHES_FLAGS_DEFAULT, 自动创建输出图像 关键点的尺寸和方向不会被画出
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, 画出关键点、尺寸和方向
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG, 手动创建输出图像
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS 单一的关键点将不被画出
2.注意
彩色图像转化为灰度图像
为了降低算法的复杂度,SIFT算法的第一步就是将传入的彩色图像转化为灰度图像
3.感谢
https://zhuanlan.zhihu.com/c_154380889