SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。
SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT 特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要 3 个以上的 SIFT 物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT 特征的信息量大,适合在海量数据库中快速准确匹配
SIFT 算法特点:
SIFT 特征检测主要包括以下 4 个基本步骤:
SIFT 特征匹配主要包括 2 个阶段
SIFT 特征的生成步骤:
所以需要修改 python 源码中的 detect_eval.py 文件的导包方式
无法安装 opencv-python 3.4.2.16
版本回退到 python3.7
解决方式
pip uninstall opencv-python
pip uninstall opencv-contrib-python
使用怕 pip 在 cmd 中安装
pip install opencv_python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
import cv2
from matplotlib import pyplot as plt
from imagedt.decorator import time_cost
print('cv version: ', cv2.__version__)
def bgr_rgb(img):
(r, g, b) = cv2.split(img)
return cv2.merge([b, g, r])
def orb_detect(image_a, image_b):
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(image_a, None)
kp2, des2 = orb.detectAndCompute(image_b, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)
img3 = cv2.drawMatches(image_a, kp1, image_b, kp2,
matches[:100], None, flags=2)
return bgr_rgb(img3)
@time_cost
def sift_detect(img1, img2, detector='surf'):
if detector.startswith('si'):
print("sift detector......")
sift = cv2.xfeatures2d.SURF_create()
else:
print("surf detector......")
sift = cv2.xfeatures2d.SURF_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
good = [[m] for m, n in matches if m.distance < 0.5 * n.distance]
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)
return bgr_rgb(img3)
if __name__ == "__main__":
image_a = cv2.imread('../images/a/dm.png')
image_b = cv2.imread('../images/b/cg.jpg')
img = sift_detect(image_a, image_b)
plt.imshow(img)
plt.show()