当前位置: 首页 > news >正文

【OpenCV】13 特征检测、匹配与图像查找

一、特征检测

应用场景

  1. 图像搜索:通过提取图像的特征点进行搜索,提高搜索效率。
  2. 拼图游戏:通过特征查找,减少搜索范围,提高拼图效率。
  3. 图片拼接:通过特征点检测,实现多张图片的拼接,例如生成全景图像。

拼图方法

  1. 寻找特征
  2. 特征是唯一的
  3. 可追踪的
  4. 能比较的

图像特征

  1. 图像特征是有意义的图像区域,具有独特性和易识别性。
  2. 角点、斑点及高密度区域都是明显的特征。
  3. 特征必须是独立、可识别和可比较的。

角点

在特征中,最重要的就是角点

  1. 灰度梯度的最大值对应的像素
  2. 两条线的交点
  3. 极值点(一阶导数的最大值,但二阶导数为零)

一、Harris角点检测 cornerHarris

Harris角点检测是一种常用的角点检测方法,将角点检测分为三种情况:平坦区域、边沿和角点。
image

  1. 光滑地区,无论向哪里移动,衡量系数不变
  2. 边缘地址,垂直边缘移动时,衡量系统变化剧烈
  3. 在交点处,往那个方向移动,衡量系统都变化剧烈

image

import cv2
import numpy as npblockSize = 2 # 检测窗口大小
ksize = 3     # Sobel的卷积核
k = 0.04      # 权重系数,经验值,一般取 0.02 ~ 0.04img = cv2.imread('img/chess.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.cornerHarris(gray, blockSize, ksize, k)## Harris角点的展示
img[dst > 0.01 * dst.max()] = [0, 0, 255]cv2.imshow('harris', img)
cv2.waitKey(0)

二、Shi-Tomasi角点检测 goodFeaturesToTrack

Shi-Tomasi是Harris角点检测的改进
Harris角点检测的稳定性和k有关,而k是个经验值,不好设定最佳值。

image

import cv2
import numpy as np# Shi-Tomasi
maxCorners = 0
ql = 0.01
minDistance = 20img = cv2.imread('img/chess.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray, maxCorners, ql, minDistance)
corners = corners.astype(np.int32)# 角点的展示
for i in corners:x, y = i.ravel()cv2.circle(img, (x,y), 3, (0, 0, 255), -1)cv2.imshow('Shi-Tomasi', img)
cv2.waitKey(0)

三、SIFT

SIFT关键点检测 detect

Harris角点的判断会受到图片缩放影响。
例如下图中,原本的角点放大后,就检测不到了
image

image

import cv2
import numpy as np# 读文件
img = cv2.imread('img/chess.jpg')# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 创建SIFT对象
sift = cv2.xfeatures2d.SIFT_create()# 进行检测
kp = sift.detect(gray, None)# 绘制keypoints
cv2.drawKeypoints(gray, kp, img)cv2.imshow('SIFT', img)
cv2.waitKey(0)

计算描述子 detectAndCompute

关键点:位置、大小和方向
关键点描述子:记录关键点周围对其有贡献的像素点的一组向量值,其不受仿射变换、光照变换等影响

image

import cv2
import numpy as np# 读文件
img = cv2.imread('img/chess.jpg')# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 创建SIFT对象
sift = cv2.xfeatures2d.SIFT_create()# 进行检测
kp, des = sift.detectAndCompute(gray, None)
print(des[0])# 绘制keypoints
cv2.drawKeypoints(gray, kp, img)cv2.imshow('SIFT', img)
cv2.waitKey(0)

四、SURF

SIFT最大的问题是速度慢,因此才有SURF。

如下代码运行会报错,因为这个算法是专利算法,要配置比较麻烦。
这里就不折腾了,只把教程中的代码贴在下面。
image

import cv2
import numpy as np# 读文件
img = cv2.imread('img/chess.jpg')# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 创建SURF对象
surf = cv2.xfeatures2d.SURF_create()# 进行检测
kp, des = surf.detectAndCompute(gray, None)
print(des[0])# 绘制keypoints
cv2.drawKeypoints(gray, kp, img)cv2.imshow('SURF', img)
cv2.waitKey(0)

五、ORB特征检测

ORB = Oriented FAST + Rotated BRIEF
ORB可以做到实时检测
image

import cv2
import numpy as np# 读文件
img = cv2.imread('img/chess.jpg')# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 创建ORB对象
orb = cv2.ORB_create()# 进行检测
kp, des = orb.detectAndCompute(gray, None)
print(des[0])# 绘制keypoints
cv2.drawKeypoints(gray, kp, img)cv2.imshow('ORB', img)
cv2.waitKey(0)

二、特征匹配

暴力特征匹配

使用第一组中的每个特征的描述子,与第二组中的所有特征描述子进行匹配。
计算它们之间的差距,然后将最接近的一个匹配返回。
image

import cv2
import numpy as np# 读文件
img1 = cv2.imread('img/dog2.jpg')
img2 = cv2.imread('img/dog.jpg')# 灰度化
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 创建SIFT对象
sift = cv2.xfeatures2d.SIFT_create()# 进行特征点检测
kp1, des1 = sift.detectAndCompute(gray1, None)
kp2, des2 = sift.detectAndCompute(gray2, None)# 创建匹配器
bf = cv2.BFMatcher(cv2.NORM_L1)# 匹配
match = bf.match(des1, des2)# 绘制
img3 = cv2.drawMatches(img1, kp1, img2, kp2, match, None)cv2.imshow('img3', img3)
cv2.waitKey(0)

FLANN 特征匹配

进行批量特征匹配时,FLANN速度更快
由于使用邻近近似值,精度较差
image

import cv2
import numpy as np# 读文件
img1 = cv2.imread('img/dog2.jpg') # search
img2 = cv2.imread('img/dog.jpg')    # origin# 灰度化
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 创建SIFT特征检测器
sift = cv2.xfeatures2d.SIFT_create()# 进行特征点检测
kp1, des1 = sift.detectAndCompute(gray1, None)
kp2, des2 = sift.detectAndCompute(gray2, None)# 创建匹配器
index_params = dict(algorithm=1, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)# 对描述子进行匹配计算
matchs = flann.knnMatch(des1, des2, k=2)good = []
for i, (m, n) in enumerate(matchs):if m.distance < 0.7 * n.distance:good.append(m)# 绘制
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, [good], None)cv2.imshow('img3', img3)
cv2.waitKey(0)

三、图像查找

image

import cv2
import numpy as np# 读文件
img1 = cv2.imread('img/dog2.jpg') # search
img2 = cv2.imread('img/dog.jpg')    # origin# 灰度化
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 创建SIFT特征检测器
sift = cv2.xfeatures2d.SIFT_create()# 进行特征点检测
kp1, des1 = sift.detectAndCompute(gray1, None)
kp2, des2 = sift.detectAndCompute(gray2, None)# 创建匹配器
index_params = dict(algorithm=1, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)# 对描述子进行匹配计算
matchs = flann.knnMatch(des1, des2, k=2)good = []
for i, (m, n) in enumerate(matchs):if m.distance < 0.7 * n.distance:good.append(m)if len(good) >= 4:srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)H, _ = cv2.findHomography(srcPts, dstPts, cv2.RANSAC, 5.0)h, w = img1.shape[:2]pts = np.float32([[0, 0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)dst = cv2.perspectiveTransform(pts, H)cv2.polylines(img2, [np.int32(dst)], True, (0, 0, 255))
else:print('the number of good is less than 4.')exit()# 绘制
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, [good], None)cv2.imshow('img3', img3)
cv2.waitKey(0)
http://www.hskmm.com/?act=detail&tid=35757

相关文章:

  • 2025视频号运营实力推荐:青海云动时空数据公司专业代运营服务商
  • windows本地jenkins打包部署远端服务
  • 生成式AI购物助手Rufus的技术架构解析
  • 2025东莞品之豪金属制品推荐:CNC精密加工源头厂家,多行业定制专家
  • 详解ROMA中复杂图表的渲染实现
  • 前端部署新方案-技术篇(总体架构设计)
  • 2025气柱袋优质厂家推荐昆山戈尔德,专业缓冲包装定制生产厂家
  • 2025数控滚齿机实力厂家推荐,无锡吉莱特智能装备高精度定制!
  • 不用重启!处理笔记本HDMI接口在睡眠后无法识别显示器问题
  • 深入解析:设计模式第六章(观察者模式)
  • CallbackData错误原因分析
  • 2025微弧氧化加工厂家推荐:常州华源专业表面处理技术供应商
  • hash判断两个集合是否完全相同
  • 2025滑触线实力厂家推荐,无锡宸澳电气多型号防爆安全定制!
  • 2025年GEO优化公司推荐:五大实力企业口碑榜,引领AI搜索营销新生态
  • 2025年10月全屋智能家居品牌推荐:盈趣领衔对比评测榜
  • 2025码垛机厂家推荐济南金瑞祥,全自动龙门桁架定制实力企业
  • 2025防腐工程厂家推荐:无锡华金喷涂技术领先,定制防腐解决方案
  • [LangChian] 05.结构化提示词
  • C#获取文件md5码
  • 2025年10月防腐木凉亭厂家对比评测榜:江西纳美领衔五强深度解析
  • 2025通风天窗实力厂家推荐,正鑫专业制造与定制服务保障
  • 2025年10月治鼻炎产品推荐:权威对比评测榜助您精准选购
  • git提PR时很多别人的commit,清理多余的commit
  • Visual Studio 使用小知识记录
  • 2025数控锯床厂家推荐无锡正川,专业立式锯床制造企业
  • DeepSeek-OCR:让 AI “一眼看懂” 的黑科技
  • 生成一张图,苹果logo是透明冰块,安卓小机器人撒尿到苹果logo,冲出一个豁口
  • 业务记录:登录
  • kafka2.8出现NotLeaderOrFollowerException