OpenCV特征检测与匹配方法概览

OpenCV特征检测与匹配⽅法概览
openCV特征检测与匹配⽅法概览
初学⼩⽩,刚开始学习图像处理,所以汇总了⼀些基础性的函数以及⽅法,贴出来供⼤家参考。有错误欢迎指正。
摘要
常⽤⾓点检测器
1. Harris⾓点
2. Shi-Tomasi &易于跟踪的特征Good Features to Track(GFtT)
3. ⾼斯差Difference of Gaussians(DoG)
4. 加速分割测试特征Features from Accelerate Segment(FAST)
空气质量流量5.关键点的绘制
常⽤特征描述符
1. 图像块(Patch)
2. 尺度不变特征变换Scale Invariant Feature Transform(SIFT)
3. 加速鲁邦特征Speeded Up Robust Features(SURF)
4. ⼆值鲁棒独⽴元素特征Binary Robust Independent Elementary Features(BRIEF)
5. Oriented FAST and Rotated BRIEF(ORB)
6. ⼆值鲁棒可缩放关键点Binary Robust Invariant Scalable Keypoints(BRISK)
常⽤匹配器
1. 暴⼒匹配器Brute-Force(BF)
2. FLANN匹配器
常⽤匹配函数及匹配绘制函数
1. bf.match()和cv
2.drawMatches()
2. bf.knnMatch()和cv2.drawMatchesKnn()
3. flann.match()和cv2.drawMatches()
4. flann.knnMatch()和cv2.drawMatches()
优化
1. 掩膜的绘制
2. RANSAC算法过滤
⼀、常⽤⾓点检测器cn1069
古代建筑模型⾸先我们要了解什么是⾓点?在⼀般的图像处理过程中最开始需要进⾏的⼯作就是特征的检测与提取,⼀般的特征分为边缘、⾓点以及感兴趣区域。边缘就是图像的轮廓边缘,呈线条状;⾓点顾名思义是⼀个个的点;感兴趣区域则是我们认为设定的⼀个区域范围。在这三类特征值之中,⾓点,通常也称为感兴趣关键点,使我们最为关⼼的特征。那么到底什么是⾓点?⾓点,就是两个或者更多边缘的交点,⼀旦⾓点出现移动或变化,将会引起图像的灰度信息的强烈变化。
这⾥顺便说明⼀下为什么在进⾏特征提取的时候需要将彩⾊图转化为灰度图。在物体识别的过程中,最主要的因素就是梯度,梯度意味着灰度上的变化,要想计算梯度,⾃然就需要应⽤到灰度图像。再者物体上的颜⾊受到光照影响容易发⽣较⼤变化,转化为灰度图像可以加速特征的提取。
上⾯我们已经说明什么是⾓点了。接下来就介绍⼀下⾓点检测器。
1. Harris⾓点检测器
应⽤函数:
img: 数据类型为float32的输⼊图像;
blockSize: ⾓点检测中要考虑的领域⼤⼩;
ksize: Sobel求导中使⽤的窗⼝⼤⼩;
k: Harris⾓点检测⽅程中的⾃由参数,取值参数为[0.04, 0.06]。
优点:稳定性⾼,尤其对L型⾓点(直⾓)检测精度⾼;
缺点:由于采⽤了⾼斯滤波,运算速度相对较慢,⾓点信息有丢失和位置偏移的现象,⽽且⾓点提取有聚簇现象。不具有尺度不变性。
Harris⾓点检测⽰例程序
import cv2
import numpy as np
filename = 'chessboard.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = Harris(gray,2,3,0.04)
#result is dilated for marking the corners, not important
dst = cv2.dilate(dst,None)
2. Shi-Tomasi &易于跟踪的特征Good Features to Track(GFtT)
应⽤函数:
Img: 浮点型32位灰度图像;
MaxCorners: 想要检测的最⼤⾓点数量;
QualityLevel: ⾓点的质量⽔平,0~1之间;
minDistance: 两⾓点之间的最短欧⽒距离。
优点:Harris的改进版,通过应⽤较⼩的特征值与阈值进⾏⽐较获得具更好的强⾓点;
缺点:由于采⽤了⾼斯滤波,运算速度相对较慢,⾓点信息有丢失和位置偏移的现象,⽽且⾓点提取有聚簇现象。不具有尺度不变性。
Shi-Tomasi &易于跟踪的特征Good Features to Track(GFtT)特征点检测⽰例程序
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('simple.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
corners = dFeaturesToTrack(gray,25,0.01,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(img,(x,y),3,255,-1)
plt.imshow(img),plt.show()
3. ⾼斯差Difference of Gaussians(DoG)
DoG是包含在SIFT和SURF特征描述符的,所以没有具体的相关函数介绍。
不同的尺度空间需要使⽤⼤⼩不同的窗⼝进⾏极值点检测,原始⽅法是使⽤具有不同⽅差值σ的⾼斯拉普拉斯算⼦(LoG)对图像进⾏卷积。但由于计算量庞⼤,所以使⽤⾼斯差(DoG)进⾏代替。
⾸先通过降采样来构成⼀组图像尺⼨不同的⾦字塔,然后对这⼀组图像使⽤具有不同⽅差σ的⾼斯卷积核构建出具有不同分辨率的图像⾦字塔。注意这是两个⾦字塔。DoG就是具有不同分辨率的图像⾦字塔中的差值。
优点:图像具有尺度不变性;相对于⾼斯拉普拉斯(LOG拉普拉斯操作+降采样)来讲,效率更⾼。
缺点:计算量⼤。
4. 加速分割测试特征Features from Accelerate Segment(FAST)
应⽤函数:
cv2.FastFeatureDetector ()
该函数初始化FAST特征检测器对象,没有具体参数。
FAST⾸先对固定半圆上的像素进⾏分割测试,通过逻辑测试可以去除⼤量的候选特征点(⽐较圆圈边缘像素值与中⼼点的像素值);然后进⾏基于分类的⾓点特征检测,利⽤ID3分类器根据16个特征判决候选点是否为⾓点特征,每个特征的状态为-1,0,1;最后利⽤⾮极⼤值抑制进⾏⾓点特征的验证。
注意:FAST被称为除上述之外任何其它特征检测器,可以通过设定阈值,是否应⽤⾮最⼤抑制,是否使⽤领域等来进⾏任意类型的检测。
优点:计算速度快,可以应⽤于实时场景;
缺点:容易受到噪声的影响以及阈值t的影响。
加速分割测试特征Features from Accelerate Segment(FAST)特征点检测⽰例程序
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('simple.jpg',0)
fast = cv2.FastFeatureDetector()
kp = fast.detect(img,None)
img2 = cv2.drawKeypoints(img, kp, color=(255,0,0))
cv2.imwrite('fast_true.png',img2)
fast.setBool('nonmaxSuppression',0)
kp = fast.detect(img,None)
print "Total Keypoints without nonmaxSuppression: ", len(kp)
img3 = cv2.drawKeypoints(img, kp, color=(255,0,0))
cv2.imwrite('fast_false.png',img3)
5. 关键点的绘制
» 在opencv中绘制关键点函数的定义为:
drawKeypoints(image, keypoints, outImage, color, flags)
image:原始图⽚;
keypoints: 从原始图⽚中获得的关键点;
outImage: 输出,可以是None;
color: 颜⾊设置(b, g, r);
flags: 绘图功能的标识设置,默认在关键点部位绘制圆圈,如果设置为
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)在关键点部位绘制圆圈并绘制出关键点的⽅向。
主要有以下⼏种绘制⽅式:
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
⼆、常⽤特征匹配符
⾸先要了解⾓点、特征点与描述符之间的区别和联系:
⾓点:包含⼤量本地信息的像素块,能够在另⼀张图中快速识别;
特征点:作为⾓点的扩展,它将像素块的信息进⾏编码从⽽使得其更易辨识;
描述符:是对特征点的进⼀步处理,具有更低的维度,从⽽使得图像块更容易在另⼀张图中被识别。
接下来我们来了解主要的描述符都有哪些。
1. 图像块(Patch)
对于⼀个特征点最直接的描述即围绕其本⾝的图像块,也就是环绕该特征的⼩块中所有像素的强度值,
⼀般简称为“外观”。这列描述符的计算只需对给定位置进⾏⼆次抽样。“外观”并不是好的描述符,因为他所携带的信息会随着⽅向、尺度和视⾓的变化⽽发⽣变化,鲁棒性和重复性较差。
应⽤范围:使⽤图像块描述符的跟踪系统多假设相机视⾓变化缓慢,从⽽使得图像块的变化也缓慢。由于局限⼤,应⽤范围⼩。光线路终端
2. 尺度不变特征变换Scale Invariant Feature Transform(SIFT)
在2004年由Lowe提出SIFT算法。它不仅具有尺度不变特性也具有旋转不变特性。
⾸先使⽤前⾯提到过的⾼斯差DoG在每⼀个不同尺度层使⽤⾼斯滤波器对图像进⾏卷积,构建图像⾦字塔,检测出特征点p,之后要为其计算⼀个具有尺度和旋转不变特性的环状多维描述符。
» 应⽤范围:SIFT描述符已被证明对光照、旋转、尺度和⾼达60度视⾓变换都具有很好的稳定性,已经成为视觉领域最流⾏的描述符。缺点是实时性不⾼、特征点检测较少。
绞车滚筒» 应⽤函数:
初始化对象:
sift = cv2.xfeatures2d.SIFT_create()
检测特征点:
kp = sift.detect(gray, None)
计算描述符:
kp, des = siftpute(gray, kp)
同时检测特征点或计算描述符:
kp, des = sift.detectAndCompute(gray,None)
尺度不变特征变换Scale Invariant Feature Transform(SIFT)⽰例程序
#coding=utf-8
import cv2
import scipy as sp
img1 = cv2.imread('x1.jpg', 0)  # queryImage
img2 = cv2.imread('x2.jpg', 0)  # trainImage
#Initiate SIFT detector纳米烟嘴
sift = cv2.xfeatures2d.SIFT_create()
#find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

本文发布于:2024-09-22 21:20:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/154940.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:特征   图像   具有   检测   绘制   尺度   灰度
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议