2024-12-05OpenCV高级-特征检测

OpenCV高级-特征检测

文章目录

  • OpenCV高级-特征检测
    • 1-OpenCV角点检测
      • 1. Harris角点检测 (`cv2.cornerHarris()`)
      • 2. Shi-Tomasi角点检测 (`cv2.goodFeaturesToTrack()`)
      • 3. KLT光流跟踪 (Lucas-Kanade角点跟踪)
      • 总结
    • 2-OpenCV特征点检测
      • 1. SIFT特征点检测 (`cv2.SIFT()`)
      • 2. SURF特征点检测 (`cv2.xfeatures2d.SURF_create()`)
      • 3. ORB特征点检测 (`cv2.ORB_create()`)
      • 4. BRISK特征点检测 (`cv2.BRISK_create()`)
      • 总结
    • 3-OpenCV特征匹配
      • 1. BFMatcher(暴力匹配) (`cv2.BFMatcher()`)
      • 2. FLANN匹配器 (`cv2.FlannBasedMatcher()`)
      • 3. KNN匹配(K-Nearest Neighbors Matching)
      • 总结

1-OpenCV角点检测


在OpenCV中,角点检测是一项非常重要的图像处理技术,常用于计算机视觉中的特征提取和跟踪。以下是如何使用OpenCV实现Harris角点检测、Shi-Tomasi角点检测和KLT光流跟踪(Lucas-Kanade角点跟踪)的具体方法。

1. Harris角点检测 (cv2.cornerHarris())

Harris角点检测是一种经典的角点检测算法,通过计算图像中每个像素的局部梯度响应来检测角点。

import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用Harris角点检测
gray_image = np.float32(gray_image)
dst = cv2.cornerHarris(gray_image, 2, 3, 0.04)# 膨胀结果以突出显示角点
dst = cv2.dilate(dst, None)# 设置阈值以标记角点
image[dst > 0.01 * dst.max()] = [0, 0, 255]  # 用红色标记角点# 显示结果
cv2.imshow('Harris Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. Shi-Tomasi角点检测 (cv2.goodFeaturesToTrack())

Shi-Tomasi角点检测是Harris角点检测的改进版本,通过计算图像中每个像素的最小特征值来检测角点。

import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用Shi-Tomasi角点检测
corners = cv2.goodFeaturesToTrack(gray_image, 100, 0.01, 10)
corners = np.int0(corners)# 在图像上绘制角点
for corner in corners:x, y = corner.ravel()cv2.circle(image, (x, y), 3, 255, -1)# 显示结果
cv2.imshow('Shi-Tomasi Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. KLT光流跟踪 (Lucas-Kanade角点跟踪)

KLT光流跟踪是一种常用的角点跟踪算法,通过计算相邻帧之间的像素位移来跟踪角点。

import cv2
import numpy as np# 读取第一帧图像
cap = cv2.VideoCapture('video.mp4')
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)# 初始化角点检测
p0 = cv2.goodFeaturesToTrack(old_gray, 100, 0.01, 10)# 创建光流跟踪所需的参数
lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))# 初始化光流跟踪
while True:ret, frame = cap.read()if not ret:breakframe_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算光流p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)# 选择好的点good_new = p1[st == 1]good_old = p0[st == 1]# 绘制跟踪结果for i, (new, old) in enumerate(zip(good_new, good_old)):a, b = new.ravel()c, d = old.ravel()frame = cv2.line(frame, (a, b), (c, d), (0, 255, 0), 2)frame = cv2.circle(frame, (a, b), 5, (0, 255, 0), -1)# 显示结果cv2.imshow('KLT Optical Flow', frame)if cv2.waitKey(30) & 0xFF == ord('q'):break# 更新前一帧和前一组点old_gray = frame_gray.copy()p0 = good_new.reshape(-1, 1, 2)cv2.destroyAllWindows()
cap.release()

总结

  • Harris角点检测 (cv2.cornerHarris): 通过计算局部梯度响应来检测角点。
  • Shi-Tomasi角点检测 (cv2.goodFeaturesToTrack): 通过计算最小特征值来检测角点,通常比Harris角点检测更稳定。
  • KLT光流跟踪 (Lucas-Kanade角点跟踪): 通过计算相邻帧之间的像素位移来跟踪角点,常用于视频中的运动分析。

这些方法可以根据具体的应用场景选择使用,如静态图像中的角点检测或视频中的角点跟踪。


2-OpenCV特征点检测


在OpenCV中,特征点检测是一项重要的任务,用于在图像中找到有意义的特征点。SIFT、SURF、ORB和BRISK是几种常用的特征点检测算法。以下是如何使用OpenCV实现这些特征点检测的具体方法。

1. SIFT特征点检测 (cv2.SIFT())

SIFT(Scale-Invariant Feature Transform)是一种非常强大的特征点检测和描述算法,对尺度和旋转具有不变性。

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 创建SIFT对象
sift = cv2.SIFT_create()# 检测SIFT特征点
kp, des = sift.detectAndCompute(image, None)# 绘制特征点
image_with_keypoints = cv2.drawKeypoints(image, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 显示结果
plt.imshow(image_with_keypoints, cmap='gray')
plt.title('SIFT特征点')
plt.show()

2. SURF特征点检测 (cv2.xfeatures2d.SURF_create())

SURF(Speeded-Up Robust Features)是SIFT的改进版本,计算速度更快。

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 创建SURF对象
surf = cv2.xfeatures2d.SURF_create(400)# 检测SURF特征点
kp, des = surf.detectAndCompute(image, None)# 绘制特征点
image_with_keypoints = cv2.drawKeypoints(image, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 显示结果
plt.imshow(image_with_keypoints, cmap='gray')
plt.title('SURF特征点')
plt.show()

3. ORB特征点检测 (cv2.ORB_create())

ORB(Oriented FAST and Rotated BRIEF)是一种高效的特征点检测和描述算法,计算速度快且适合实时应用。

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 创建ORB对象
orb = cv2.ORB_create()# 检测ORB特征点
kp, des = orb.detectAndCompute(image, None)# 绘制特征点
image_with_keypoints = cv2.drawKeypoints(image, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 显示结果
plt.imshow(image_with_keypoints, cmap='gray')
plt.title('ORB特征点')
plt.show()

4. BRISK特征点检测 (cv2.BRISK_create())

BRISK(Binary Robust Invariant Scalable Keypoints)是一种基于二进制描述符的特征点检测算法,计算速度快且对尺度和旋转具有鲁棒性。

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 创建BRISK对象
brisk = cv2.BRISK_create()# 检测BRISK特征点
kp, des = brisk.detectAndCompute(image, None)# 绘制特征点
image_with_keypoints = cv2.drawKeypoints(image, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 显示结果
plt.imshow(image_with_keypoints, cmap='gray')
plt.title('BRISK特征点')
plt.show()

总结

  • SIFT特征点检测 (cv2.SIFT_create): 对尺度和旋转具有不变性,计算复杂度较高。
  • SURF特征点检测 (cv2.xfeatures2d.SURF_create): SIFT的改进版本,计算速度更快。
  • ORB特征点检测 (cv2.ORB_create): 计算速度快,适用于实时应用。
  • BRISK特征点检测 (cv2.BRISK_create): 基于二进制描述符,计算速度快且对尺度和旋转具有鲁棒性。

这些特征点检测算法各有优势,可以根据具体的应用场景选择合适的算法。


3-OpenCV特征匹配


在OpenCV中,特征匹配是计算机视觉中的一个关键步骤,用于在两幅图像之间找到匹配的特征点。常用的匹配方法包括BFMatcher(暴力匹配)、FLANN匹配器、KNN匹配等。以下是如何使用OpenCV实现这些特征匹配的具体方法。

1. BFMatcher(暴力匹配) (cv2.BFMatcher())

BFMatcher是最简单的匹配方法,通过计算描述符之间的距离来匹配特征点。

import cv2
import matplotlib.pyplot as plt# 读取图像
image1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)# 创建ORB特征点检测器
orb = cv2.ORB_create()# 检测特征点和计算描述符
kp1, des1 = orb.detectAndCompute(image1, None)
kp2, des2 = orb.detectAndCompute(image2, None)# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)# 匹配描述符
matches = bf.match(des1, des2)# 按距离排序
matches = sorted(matches, key=lambda x: x.distance)# 绘制前10个匹配结果
image_matches = cv2.drawMatches(image1, kp1, image2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)# 显示结果
plt.imshow(image_matches)
plt.title('BFMatcher (Brute-Force Matching)')
plt.show()

2. FLANN匹配器 (cv2.FlannBasedMatcher())

FLANN(Fast Library for Approximate Nearest Neighbors)是一种高效的近似最近邻搜索算法,适用于大规模数据集。

import cv2
import matplotlib.pyplot as plt# 读取图像
image1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)# 创建SIFT特征点检测器
sift = cv2.SIFT_create()# 检测特征点和计算描述符
kp1, des1 = sift.detectAndCompute(image1, None)
kp2, des2 = sift.detectAndCompute(image2, None)# FLANN匹配器参数
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)# 创建FLANN匹配器对象
flann = cv2.FlannBasedMatcher(index_params, search_params)# 匹配描述符
matches = flann.knnMatch(des1, des2, k=2)# 过滤匹配结果
good_matches = []
for m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)# 绘制匹配结果
image_matches = cv2.drawMatches(image1, kp1, image2, kp2, good_matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)# 显示结果
plt.imshow(image_matches)
plt.title('FLANN Matcher')
plt.show()

3. KNN匹配(K-Nearest Neighbors Matching)

KNN匹配是一种常见的匹配方法,通过计算每个特征点的K个最近邻来匹配特征点。

import cv2
import matplotlib.pyplot as plt# 读取图像
image1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)# 创建ORB特征点检测器
orb = cv2.ORB_create()# 检测特征点和计算描述符
kp1, des1 = orb.detectAndCompute(image1, None)
kp2, des2 = orb.detectAndCompute(image2, None)# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING)# KNN匹配描述符
matches = bf.knnMatch(des1, des2, k=2)# 过滤匹配结果
good_matches = []
for m, n in matches:if m.distance < 0.75 * n.distance:good_matches.append([m])# 绘制匹配结果
image_matches = cv2.drawMatchesKnn(image1, kp1, image2, kp2, good_matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)# 显示结果
plt.imshow(image_matches)
plt.title('KNN Matching')
plt.show()

总结

  • BFMatcher(暴力匹配) (cv2.BFMatcher): 通过计算描述符之间的距离来匹配特征点,适用于小规模数据集。
  • FLANN匹配器 (cv2.FlannBasedMatcher): 使用近似最近邻搜索算法,适用于大规模数据集,匹配速度较快。
  • KNN匹配(K-Nearest Neighbors Matching): 通过计算每个特征点的K个最近邻来匹配特征点,常用于过滤匹配结果,提高匹配精度。

这些匹配方法各有优势,可以根据具体的应用场景选择合适的算法。在实际应用中,通常需要结合多种方法以达到最佳的匹配效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34746.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ABAP 类与对象 EXCEPTIONS与RAISE

文章目录 ABAP 类与对象 EXCEPTIONS与RAISE系统示例代码执行结果RAISE的系统文档测试 ABAP 类与对象 EXCEPTIONS与RAISE 系统示例 代码 CLASS cls DEFINITION.PUBLIC SECTION.CLASS-METHODS meth EXCEPTIONS exc. ENDCLASS.CLASS cls IMPLEMENTATION.METHOD meth....RAISE ex…

接第二部分 Advanced Learning Algorithms

接第二部分 Advanced Learning Algorithms 文章目录 接第二部分 Advanced Learning AlgorithmsMachine learning development process(机器学习开发的迭代)Iterative loop of ML development错误分析(error analysis)添加数据(Adding data)迁移学习&#xff1a;使用其他任务中的…

AI新动向:豆包文生图升级,文心一言领先市场

在今日的AI资讯中&#xff0c;我们关注到了几个重要的行业动态&#xff0c;其中包括字节跳动AI助手豆包的功能升级&#xff0c;以及百度文心一言在生成式AI市场的领先地位。 字节跳动旗下的智能AI助手豆包近期对其文生图能力进行了显著提升&#xff0c;用户现在可以通过一键操…

力扣54.螺旋矩阵

题目描述 题目链接54. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;…

【第 1 章 初识 C 语言】1.10 - 1.11 本书的组织结构、本书的约定

目录 1.10 本书的组织结构 1.11 本书约定 1.11.1 字体 1.11.2 程序输出 特殊的击键 本书使用的系统 读者的系统 1.11.3 特殊元素 1.10 本书的组织结构 本书采用多种方式编排内容&#xff0c;其中最直接的方法是介绍 A 主题的所有内容、介绍 B 主题的所有内容&#xff0…

# 06_Python基础到实战一飞冲天(三)-python面向对象(六)--类属性和类方法和单例

06_Python基础到实战一飞冲天&#xff08;三&#xff09;-python面向对象&#xff08;六&#xff09;–类属性和类方法和单例 一、类属性-05-使用对象名类属性赋值语句会创建实例属性 1、使用对象名访问类属性的问题注意 如果使用 对象.类属性 值 赋值语句&#xff0c;只会…

【目标跟踪】DUT Anti-UAV数据集详细介绍

DUT Anti-UAV数据集是大连理工大学的团队公开的数据集&#xff08;DUT是他们学校的简称&#xff09;&#xff0c;其中包括了两个子数据集&#xff1a;目标检测和目标跟踪&#xff08;也就是说&#xff0c;目标检测和目标跟踪都可以用这个数据集&#xff09;。该数据集为可见光模…

★ 数据结构 ★ 排序

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起学习数据结构中的各种排序~ ​❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 数据结构专栏&#xff1a;https://blog.csdn.net/2302_80328146/categ…

c语言基础三:运算符和表达式

一、常用的运算符分类 运算符类型 作用 算术运算符 用于处理四则运算 赋值运算符 用于将表达式的值赋给变量 比较运算符 用于表达式的比较&#xff0c;并返回一个真值或假值 逻辑运算符 用于根据表达式的值返回真值或假值 位运算符 用于处理数据的位运算 s…

如何通过金蝶云星空高效集成销售出库单

金蝶云星空数据集成案例分享&#xff1a;销售出库单-&#xff08;分销&京东&唯品&虚拟除外&#xff09;手表汇总 在企业信息化系统中&#xff0c;数据的高效流转和准确对接是业务运作的关键。本文将聚焦于一个具体的系统对接集成案例&#xff0c;即如何将金蝶云星…

【SKFramework框架核心模块】3-4、事件模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

鸿蒙分享:添加模块,修改app名称图标

新建公共模块common 在entry的oh-package.json5添加dependencies&#xff0c;引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&#xff1a; common--src--resources--string.json 新增&#xff1a; {"name&q…

逆向攻防世界CTF系列48-Signin.md

逆向攻防世界CTF系列48-Signin.md 直接定位 输入&#xff0c;然后跟踪96A 一个整数一个余数你会发现这是把输入字符变成两个分开的十六进制存储起来&#xff0c;比如输入字符 ‘1’ &#xff0c;它的整数是49&#xff0c;49除16的整数是3&#xff0c;余数是1&#xff0c;在byt…

最新版Chrome谷歌加载ActiveX控件之金格iWebOffice2015控件

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

Lakehouse 架构下的元数据“大一统”管理深度解析

在湖仓一体&#xff08;Lakehouse&#xff09;出现之前&#xff0c;数据仓库和数据湖堪称数据领域的两大“顶流”。打个比方&#xff0c;要是把数据仓库比作一座大型图书馆&#xff0c;那其中的数据就如同馆内藏书&#xff0c;需要按照规范放好&#xff0c;借阅者只需依照类别索…

【AI系统】MobileVit 系列

MobileVit 系列 自 Vision Transformer 出现之后&#xff0c;人们发现 Transformer 也可以应用在计算机视觉领域&#xff0c;并且效果还是非常不错的。但是基于 Transformer 的网络模型通常具有数十亿或数百亿个参数&#xff0c;这使得它们的模型文件非常大&#xff0c;不仅占…

投稿指南——论文检索报告如何开具

【SciencePub学术】论文发表被SCI数据库收录之后&#xff0c;作为学术成果上报时&#xff0c;一般需要提供论文检索报告&#xff0c;SCI论文检索报告怎么开&#xff1f;在哪开&#xff1f;要注意什么&#xff1f;这些问题&#xff0c;本期小编给大家解答一下。 Q 开具检索报告…

Jenkins 推送报错 - SSH 密钥失效

目录 问题描述报错原因解决方案 问题描述 jenkins 构建完毕后&#xff0c;将构建好的 jar 包推送至远端服务器时&#xff0c;Deploy 阶段报如下错误&#xff1a; sshpass -p **** scp -o StrictHostKeyCheckingno -P 22 -r /data/jenkins/workspace/TAI/TAI/AllCam-tai-cloud/…

《ODIN: A Single Model for 2D and 3D Segmentation》CVPR2024

斯坦福和微软&#xff1a; 代码链接&#xff1a;ODIN: A Single Model For 2D and 3D Perception 论文链接&#xff1a;2401.02416 摘要 这篇论文介绍了ODIN&#xff08;Omni-Dimensional INstance segmentation&#xff09;&#xff0c;一个能够同时处理2D RGB图像和3D点云…

三、代码管理-Git

文章目录 前言一、Git1. Git 与 SVN 区别2. Git 入门3. 客户端工具4. 主流Git仓库 二、GitLab1. 介绍2. 适合的场景 二、GitHub1. 介绍2. 适合的场景 三、Gitee1. 介绍2. 适合的场景 四、GitCode1. 介绍2. 适合的场景 五、总结 前言 代码托管‌ Git作为目前最为流行的版本控制…