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

OpenCV ORB角点检测匹配和偏移计算

OpenCV ORB角点检测匹配和偏移计算

  • 1. 简介
  • 2. ORB角点检测匹配和偏移计算
    • 2.1. 创建平移图片
    • 2.2. ORB角点检测
    • 2.3. ORB角点匹配
    • 2.4. 计算变换矩阵


1. 简介

首先通过 cv2.ORB_create 创建ORB检测器 orb
然后通过 orb.detectAndCompute 检测两张图片获得ORB角点,
接着通过匹配器 cv2.BFMatcher 进行配对,
最后通过 cv2.findHomography 计算变换矩阵。


2. ORB角点检测匹配和偏移计算


2.1. 创建平移图片

首先我们先创建一个平移图片作为两个比较的图片

from cv2 import cv2
import numpy as np


# 读取图片文件
demo_file_path = 'img1.png'
img = cv2.imdecode(np.fromfile(demo_file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
cv2.imshow('origin img', img)

# 平移变量
T_x, T_y = 10, 20

# 旋转变量 0°
angles = 0
sin_phi, cos_phi = np.sin(np.radians(angles)), np.cos(np.radians(angles))

# 构造仿射变换矩阵H 2*3
H = np.float32([[cos_phi, -sin_phi, T_x],
                [sin_phi, cos_phi, T_y]])
np.set_printoptions(suppress=True)
print(H)

# 仿射变换
new_img = cv2.warpAffine(img, H, (img.shape[1], img.shape[0]))

# 保存图片
cv2.imencode('.png', new_img)[1].tofile('img2.png')
cv2.imshow('new img', new_img)
cv2.waitKey(0)

平移x轴10个像素点,y轴20个像素点,其他不变,如下图所示:

在这里插入图片描述
仿射变换矩阵 H H H,这里纯平移,所以也是就平移矩阵,如下:

[[ 1. -0. 10.]
 [ 0.  1. 20.]]

关于透视变换参考:《OpenCV 透视变换》


2.2. ORB角点检测

import cv2
import numpy as np
 
# 读取两个连续图像
img1 = cv2.imread('img1.png')
img2 = cv2.imread('img2.png')
 
# 初始化ORB检测器
orb = cv2.ORB_create(nfeatures=500)

# 检测关键点和描述符
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)

# 显示ORB角点
keypoints_img1 = cv2.drawKeypoints(img1, kp1, None, color=(0,255,0), flags=0)
keypoints_img2 = cv2.drawKeypoints(img2, kp2, None, color=(0,255,0), flags=0)
cv2.imshow('Keypoints Image1', keypoints_img1)
cv2.imshow('Keypoints Image2', keypoints_img2)

首先通过 cv2.ORB_create 创建ORB检测器 orb
然后通过 orb.detectAndCompute 检测两张图片获得ORB角点
然后通过 cv2.drawKeypoints 将角点可视化,如下图:

在这里插入图片描述


2.3. ORB角点匹配

# 创建匹配器
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)

# 根据匹配结果排序,取较优的50个
matches = sorted(matches, key = lambda x:x.distance)[:50]
 
# 显示匹配关系
matches_img = cv2.drawMatches(img1, kp1, img2, kp2, matches, None, flags=2)
cv2.imshow('Matches Image', matches_img)

通过 cv2.BFMatcher 创建匹配器,其中有两个参数:

  1. normType:它指定要使用的距离量度。
    默认是 cv2.NORM_L2,对于SIFT,SURF 效果较佳
    对于二进制字符串的描述子,比如ORB,BRIEF,BRISK等,应该用cv2.NORM_HAMMING(汉明距离度量)
    使用,如果ORB检测器的 WTA_K 设置 3或者4,应该用cv2.NORM_HAMMING2

  2. crossCheck:匹配器为每个查询描述符找到 k 个距离最近的匹配描述符;
    默认为 False,为 True 时,只返回满足交叉验证条件的匹配结果。

在这里插入图片描述


2.4. 计算变换矩阵

# 提取匹配点
src_pts = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1,1,2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1,1,2)
 
# 计算变换矩阵
H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
matchesMask = mask.ravel().tolist()  # 可用于cv2.drawMatches可视化匹配关系的掩模
np.set_printoptions(suppress=True)
print(H)

# 可视化变换结果
offset_img = cv2.warpPerspective(img1, H, (img1.shape[1], img1.shape[0]))
cv2.imshow('Offset Image', offset_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

提取匹配点两个图片的src_ptsdst_pts,通过 cv2.findHomography 计算变换矩阵
可以看到计算出来的透视变换矩阵可以看到结果为x轴平移,与实际一致

[[ 1.  0. 10.]
 [-0.  1. 20.]
 [-0.  0.  1.]]

那么,显示变换结果也将一致,如下图:

在这里插入图片描述


谢谢


http://www.kler.cn/a/369107.html

相关文章:

  • 前端算法:树(力扣144、94、145、100、104题)
  • 51单片机完全学习——红外遥控
  • Elasticsearch 与 Lucene 的区别和联系
  • 使用注解@ExcelIgnoreUnannotated实现了在导出 Excel 时忽略没有被标注的字段
  • 【版本管理】cmake 编译的 c++ 可执行文件输出 git commit 版本(即 hash 值)
  • ThinkPad T480拆机屏幕改装:便携式显示器DIY指南
  • QT 机器视觉 1.相机类型
  • springboot集成camunda学习与使用
  • 微信小程序 - 图像加载时渐隐淡入效果 image,实现渐入渐出动画效果,微信小程序实现图片加载淡入淡出效果,图像加载时的渐隐淡入效果!
  • 全网最简单的Java设计模式【九】原型模式深入解析
  • 深入分析梧桐数据库SQL查询之挖掘季度销售冠军
  • 安卓14上蓝牙调用SystemProperties.set(),解决找不到SystemProperties.set()的问题
  • Ubuntu 2张4090,显卡安装,无法双屏显示
  • [产品管理-51]:产品经理:塑造未来的多面手,道、法、术、器的全面掌控
  • 【完整版】opencv-python-headless、opencv-python和opencv-contrib-python区别和联系
  • AI Weekly3:过去一周重要的AI资讯汇总
  • 记录一个docker volume映射目录创建文件报错问题
  • 量子容错计算
  • ts:数组的常用方法(filter)
  • 开源模型应用落地-Qwen2.5-7B-Instruct与vllm实现离线推理-使用Lora权重(三)
  • python包的其他安装方法:whl、.tar.gz
  • 2024 年 MathorCup 数学应用挑战赛——大数据竞赛-赛道 A:台风的分类与预测
  • 【Docker大揭秘】
  • 【力扣】[Java版] 刷题笔记-70. 爬楼梯
  • JavaScript 前端开发
  • Python 网络爬虫:基础与实践