【嵌入式应用12】ORB原理与应用初探

ORB原理与应用初探:

1.验证旋转不变性

import numpy as np
import cv2
from matplotlib import pyplot as plt
# sift = cv2.xfeatures2d.SIFT_create()
orb = cv2.ORB_create()
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
img1 = cv2.imread('test1.jpg')
#使用cv2.imread()接口读图像,读进来的是BGR格式以及[0~255]。所以要将img转换为RGB格式,不然后面显示会有色差
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度处理图像
# kp1, des1 = sift.detectAndCompute(img1,None)#des是描述符
kp1 = orb.detect(img1,None)
kp1, des1 = orb.compute(img1, kp1)
print (des1.shape) #描述符数组维度 
print(len(kp1))   #关键点个数
(500, 32)
500
img2 = cv2.imread('test2.jpg')
#使用cv2.imread()接口读图像,读进来的是BGR格式以及[0~255]。所以要将img转换为RGB格式,不然后面显示会有色差
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# kp2, des2 = sift.detectAndCompute(img2,None)
kp2 = orb.detect(img2,None)
kp2, des2 = orb.compute(img2, kp2)
print (des2.shape) #描述符数组维度 
print(len(kp2))   #关键点个数
(500, 32)
500

水平拼接,显示原图

print(img1.shape)
print(img2.shape)
hmerge = np.hstack((img1, img2)) #水平拼接
plt.figure(num=1,figsize=(16,16))
plt.imshow(hmerge)
plt.title('original')
plt.axis('off')
plt.show()
(854, 683, 3)
(854, 683, 3)

output_6_1

将图片水平拼接并显示

hmerge = np.hstack((gray1, gray2)) #水平拼接
plt.figure(num=1,figsize=(16,16))
plt.imshow(hmerge,cmap='gray')
plt.title('gray')
plt.axis('off')
plt.show()

png

使用cv2.drawKeypoints()进行画图操作,在图中画出关键点。

img3 = cv2.drawKeypoints(img1,kp1,img1,color=(255,0,255))
img4 = cv2.drawKeypoints(img2,kp2,img2,color=(255,0,255))

水平拼接并显示

hmerge = np.hstack((img3, img4)) #水平拼接
plt.figure(num=1,figsize=(16,16))
plt.imshow(hmerge)
plt.title('keypoint')
plt.axis('off')
plt.show()

png

flann.knnMatch解决匹配并调整ratio

matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)

img5 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:80], img2, flags=2)

plt.imshow(img5), plt.show()

png

(<matplotlib.image.AxesImage at 0x1c11d06b908>, None)

2.验证尺度不变性

载入图片并显示尺寸大小和原始图片

img1 = cv2.imread("test1.jpg")
img2 = cv2.imread("test3.jpg")
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
print(img1.shape)
print(img2.shape)
plt.figure(num=1,figsize=(12,12))
plt.imshow(img1,cmap='gray')
plt.title('original_img1')
plt.axis('off')
plt.show()
plt.figure(num=1,figsize=(12,12))
plt.imshow(img2,cmap='gray')
plt.title('original_img2')
plt.axis('off')
plt.show()
(854, 683, 3)
(427, 341, 3)

png

png

灰度化处理,打印描述符数组维度和关键点个数

gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
kp1 = orb.detect(img1,None)
kp1, des1 = orb.compute(img1, kp1)
print (des1.shape) #描述符数组维度 
print(len(kp1))   #关键点个数
(500, 32)
500

灰度化处理,打印描述符数组维度和关键点个数

gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
kp2 = orb.detect(img2,None)
kp2, des2 = orb.compute(img2, kp2)
print (des1.shape) #描述符数组维度 
print(len(kp2))   #关键点个数
(500, 32)
481

显示灰度化图像

plt.figure(num=1,figsize=(12,12))
plt.imshow(gray1,cmap='gray')
plt.title('gray1')
plt.axis('off')
plt.show()
plt.figure(num=1,figsize=(12,12))
plt.imshow(gray2,cmap='gray')
plt.title('gray2')
plt.axis('off')
plt.show()

png

png

img3 = cv2.drawKeypoints(img1,kp1,img1,color=(255,0,255))
img4 = cv2.drawKeypoints(img2,kp2,img2,color=(255,0,255))

画出关键点并显示

plt.figure(num=1,figsize=(12,12))
plt.imshow(img3)
plt.title('keypoint_img3')
plt.axis('off')
plt.show()
plt.figure(num=1,figsize=(12,12))
plt.imshow(img4)
plt.title('keypoint_img4')
plt.axis('off')
plt.show()

png

png

matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)

img5 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:80], img2, flags=2)

plt.imshow(img5), plt.show()

png

(<matplotlib.image.AxesImage at 0x1c116ad0a08>, None)

3.验证亮度不变性

将原始图片改变亮度和对比度,然后进行对比显示

img1 = cv2.imread("test1.jpg")
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
res = np.uint8(np.clip((1.5 * img1 + 10), 0, 255))
print(img1.shape)
print(res.shape)
tmp = np.hstack((img1, res))  # 两张图片横向合并(便于对比显示)
plt.figure(num=1,figsize=(16,16))
plt.imshow(tmp)
plt.title('original')
plt.axis('off')
plt.show()
(854, 683, 3)
(854, 683, 3)

png

gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度处理图像
kp1 = orb.detect(img1,None)
kp1, des1 = orb.compute(img1, kp1)
print (des1.shape) #描述符数组维度 
print(len(kp1))   #关键点个数
(500, 32)
500
gray2 = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY) #灰度处理图像
kp2 = orb.detect(img2,None)
kp2, des2 = orb.compute(img2, kp2)
print (des2.shape) #描述符数组维度 
print(len(kp2))   #关键点个数
(478, 32)
478
hmerge = np.hstack((gray1, gray2))  # 两张图片横向合并(便于对比显示)
plt.figure(num=1,figsize=(16,16))
plt.imshow(hmerge,cmap='gray')
plt.title('gray')
plt.axis('off')
plt.show()

png

img3 = cv2.drawKeypoints(img1,kp1,img1,color=(255,0,255))
img4 = cv2.drawKeypoints(res,kp2,res,color=(255,0,255))
hmerge = np.hstack((img3, img4)) #水平拼接
plt.figure(num=1,figsize=(16,16))
plt.imshow(hmerge)
plt.title('keypoint')
plt.axis('off')
plt.show()

png

flann.knnMatch解决匹配并调整ratio

matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)

img5 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:80], img2, flags=2)

plt.imshow(img5), plt.show()

png

(<matplotlib.image.AxesImage at 0x1c11d078a08>, None)

4.验证仿射不变性

对原图进行仿射变换并输出

img = cv2.imread('test1.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
rows, cols, ch = img.shape
 
pts1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])
pts2 = np.float32([[cols * 0.2, rows * 0.1], [cols * 0.9, rows * 0.2], [cols * 0.1, rows * 0.9]])
 
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (cols, rows))
plt.figure(num=1,figsize=(16,16))
plt.imshow(dst)
plt.title('affine_img')
plt.axis('off')
plt.show()

png

显示原图和仿射图

print(img.shape)
print(dst.shape)
hmerge = np.hstack((img, dst))  # 两张图片横向合并(便于对比显示)
plt.figure(num=1,figsize=(16,16))
plt.imshow(hmerge)
plt.title('original')
plt.axis('off')
plt.show()
(854, 683, 3)
(854, 683, 3)

png

gray1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度处理图像
kp1 = orb.detect(img1,None)
kp1, des1 = orb.compute(img1, kp1)
print (des1.shape) #描述符数组维度 
print(len(kp1))   #关键点个数
(500, 32)
500
gray2 = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY) #灰度处理图像
kp2 = orb.detect(img2,None)
kp2, des2 = orb.compute(img2, kp2)
print (des2.shape) #描述符数组维度 
print(len(kp2))   #关键点个数
(478, 32)
478

显示灰度化图像

hmerge = np.hstack((gray1, gray2))  # 两张图片横向合并(便于对比显示)
plt.figure(num=1,figsize=(16,16))
plt.imshow(hmerge,cmap='gray')
plt.title('gray')
plt.axis('off')
plt.show()

png

img3 = cv2.drawKeypoints(img,kp1,img,color=(255,0,255))
img4 = cv2.drawKeypoints(dst,kp2,dst,color=(255,0,255))

画关键点并显示

hmerge = np.hstack((img3, img4)) #水平拼接
plt.figure(num=1,figsize=(16,16))
plt.imshow(hmerge)
plt.title('keypoint')
plt.axis('off')
plt.show()

png

matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)

img5 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:80], img2, flags=2)

plt.imshow(img5), plt.show()

png

(<matplotlib.image.AxesImage at 0x1c11d4f9a88>, None)

结论:ORB验证仿射不支持。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值