ORB 特征提取算法--理论
ORB 特征提取算法(理论篇) - Alex777 - 博客园
ORB 特征提取算法--实践篇
ORB 特征提取算法(理论篇) - Alex777 - 博客园
Python OpenCV orb特征提取和匹配
OpenCV-Python ORB特征匹配(实践篇)_Loner...的博客-CSDN博客_orb
调整图像大小
python-opencv-图像缩放 - 天子骄龙 - 博客园
import cv2 as cv
import numpy as np
def ORB_Feature(img1, img2):
# 初始化ORB
i = 0
orb = cv.ORB_create()
# 寻找关键点
kp1 = orb.detect(img1)
kp2 = orb.detect(img2)
# 计算描述符
kp1, des1 = orb.compute(img1, kp1)
kp2, des2 = orb.compute(img2, kp2)
# 画出关键点
outimg1 = cv.drawKeypoints(img1, keypoints=kp1, outImage=None)
outimg2 = cv.drawKeypoints(img2, keypoints=kp2, outImage=None)
# 显示关键点
# import numpy as np
# outimg3 = np.hstack([outimg1, outimg2])
# cv.imshow("Key Points", outimg3)
# cv.waitKey(0)
# 初始化 BFMatcher
bf = cv.BFMatcher(cv.NORM_HAMMING)
# 对描述子进行匹配
matches = bf.match(des1, des2)
# 计算最大距离和最小距离
min_distance = matches[0].distance
max_distance = matches[0].distance
for x in matches:
if x.distance < min_distance:
min_distance = x.distance
if x.distance > max_distance:
max_distance = x.distance
# 筛选匹配点
'''
当描述子之间的距离大于两倍的最小距离时,认为匹配有误。
但有时候最小距离会非常小,所以设置一个经验值30作为下限。
'''
good_match = []
for x in matches:
if x.distance <= max(1.1 * min_distance, 30):
good_match.append(x)
i = i + 1
# 绘制匹配结果
draw_match(img1, img2, kp1, kp2, good_match)
print (i)
def draw_match(img1, img2, kp1, kp2, match):
outimage = cv.drawMatches(img1, kp1, img2, kp2, match, outImg=None)
cv.imshow("Match Result", outimage)
cv.waitKey(0)
if __name__ == '__main__':
# 读取图片
img1 = cv.imread('E:\Tests\img1.jpg')
img1 = cv.resize(img1, (960, 640))
img2 = cv.imread('E:\Tests\img3.jpg')
img2 = cv.resize(img2, (960, 640))
ORB_Feature(img1, img2)
扩展: ORB特征检测完之后,如何画出并显示。
函数表示:
cv2.drawKeypoints(image, keypoints, outImage, color=None, flags=None)
image
原始图像,可以使三通道或单通道图像;
keypoints 特征点向量,向量内每一个元素是一个KeyPoint对象,包含了特征点的各种属性信息;
outImage 特征点绘制的画布图像,可以是原图像;
color 绘制的特征点的颜色信息,默认绘制的是随机彩色;
flags
特征点的绘制模式,其实就是设置特征点的那些信息需要绘制,那些不需要绘制,有以下几种模式可选:
DRAW_MATCHES_FLAGS_DEFAULT:只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:函数不创建输出的图像,而是直接在输出图像变量空间绘制,要求本身输出图像变量就是一个初始化好了的,size与type都是已经初始化好的变量。
DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS :单点的特征点不被绘制。
DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐标,size和方向,是最能显示特征的一种绘制方式。
示例代码:
import cv2
import numpy as np
def SIFT(img):
I = cv2.imread(img)
descriptor = cv2.xfeatures2d.SIFT_create() # 在2004年,不列颠哥伦比亚大学的D.Lowe在他的论文中提出了一种新的算法,即尺度不变特征变换(SIFT)
(kps, features) = descriptor.detectAndCompute(I, None)
cv2.drawKeypoints(I, kps, I, (0, 255, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('img', I)
cv2.waitKey(0)
cv2.imwrite('sift_keypoints.jpg', I)
cv2.destroyAllWindows()
if __name__ == '__main__':
SIFT('left.png')
运行结果:
以上代码参考网友的内容,稍加修改,换成orb特征提取和显示部分内容即可。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('E:/Tests/corridor-1.jpg',0)
plt.imshow(img)
plt.show()
# Initiate STAR detector
orb = cv2.ORB_create()
# find the keypoints with ORB
kp = orb.detect(img,None)
# draw only keypoints location,not size and orientation
#img2 = cv2.drawKeypoints(img, kp, None, color=(0,255,0), flags=0)
img2 = cv2.drawKeypoints(img, kp, img, color=None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(img2)
plt.show()
扩展: 用于ORB-SLAM中的orb特征描述和解析
扩展--特征提取方法