OpenCV 关键点定位
一、Opencv关键点定位介绍
关键点定位在计算机视觉领域占据着核心地位,它能够精准识别图像里物体的关键特征点。OpenCV 作为功能强大的计算机视觉库,提供了多种实用的关键点定位方法。本文将详细阐述关键点定位的基本原理,深入探讨 OpenCV 中几种常用的关键点定位算法,通过具体代码示例展示其使用方法,并介绍关键点定位在不同领域的实际应用。
在当今数字化时代,计算机视觉技术发展迅猛,广泛应用于图像识别、目标跟踪、机器人导航等众多领域。关键点定位作为计算机视觉的基础任务之一,旨在找出图像中具有代表性的特征点,这些点能够反映物体的结构和形状信息。OpenCV 凭借其丰富的函数库和高效的算法实现,成为了关键点定位的首选工具。
二、关键点定位原理
2.1 特征点的定义
特征点是图像中具有独特性质的点,通常具有以下特点:
独特性:在图像中能够明显区别于周围的点。
稳定性:在不同的光照、旋转、缩放等条件下,特征点的位置和特征能够保持相对稳定。
可重复性:在不同的图像或同一图像的不同视角下,能够可靠地检测到相同的特征点。
2.2 关键点定位的基本步骤
特征检测:在图像中找出可能的特征点。常用的方法有基于灰度变化、边缘检测等。
特征描述:为检测到的特征点生成一个描述符,用于表示该特征点的特征信息。描述符通常是一个向量,能够在不同的图像中匹配相同的特征点。
特征匹配:将不同图像中的特征点进行匹配,找出它们之间的对应关系。
三、代码实现
1. 导入必要的库
import numpy as np
import cv2
import dlib
numpy:是一个用于科学计算的基础库,提供了多维数组对象和处理这些数组的工具。
cv2:是 OpenCV 库,用于计算机视觉任务,如读取图像、绘制图形等。
dlib:是一个强大的机器学习库,在人脸检测和关键点定位方面有很好的表现。
2. 读取图像
img = cv2.imread("cr73.png")
cv2.imread:用于读取指定路径的图像文件,这里读取的是名为 cr73.png 的图像,并将其存储在变量 img 中。
3. 初始化人脸检测器
detector = dlib.get_frontal_face_detector()
faces = detector(img, 0)
dlib.get_frontal_face_detector():返回一个预训练好的人脸检测器对象 detector,用于检测图像中的人脸。
detector(img, 0):调用人脸检测器对图像 img 进行人脸检测。第二个参数 0 表示不进行图像金字塔的上采样,即只在原始图像上进行检测。检测结果存储在 faces 中,faces 是一个包含检测到的人脸矩形区域的列表。
4. 初始化关键点检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
dlib.shape_predictor:用于加载预训练好的 68 个关键点检测器模型。这里需要提供模型文件的路径 "shape_predictor_68_face_landmarks.dat",该模型可以根据检测到的人脸区域预测出 68 个关键点的位置。
5. 遍历检测到的人脸并标注关键点
for face in faces:shape = predictor(img, face)landmarks = np.array([[p.x, p.y] for p in shape.parts()])for idx, point in enumerate(landmarks):pos = (point[0], point[1])cv2.circle(img, pos, 2, color=(0, 255, 0), thickness=-1)cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 0.4,(255, 255, 255), 1, cv2.LINE_AA)
shape = predictor(img, face):对于每个检测到的人脸区域 face,使用关键点检测器 predictor 在图像 img 上预测 68 个关键点的位置,结果存储在 shape 中。
landmarks = np.array([[p.x, p.y] for p in shape.parts()]):将 shape 中的关键点位置信息转换为 numpy 数组 landmarks,每个关键点用二维坐标 [x, y] 表示。
for idx, point in enumerate(landmarks):遍历 landmarks 中的每个关键点,idx 是关键点的编号(从 0 到 67),point 是关键点的坐标。
pos = (point[0], point[1]):将关键点的坐标转换为元组 pos,用于后续的绘制操作。
cv2.circle(img, pos, 2, color=(0, 255, 0), thickness=-1):在图像 img 上以 pos 为圆心,半径为 2 像素绘制一个绿色的实心圆,用于标记关键点。
cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 255), 1, cv2.LINE_AA):在图像 img 上以 pos 为位置,使用 cv2.FONT_HERSHEY_SIMPLEX 字体,字号为 0.4,颜色为白色,线宽为 1 绘制关键点的编号 str(idx),并使用抗锯齿线条 cv2.LINE_AA 使文字更平滑。
6. 显示图像并等待按键
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow("img", img):在名为 "img" 的窗口中显示处理后的图像 img。
cv2.waitKey(0):等待用户按下任意按键,0 表示无限等待。
cv2.destroyAllWindows():关闭所有由 OpenCV 打开的窗口。
完整代码:
import numpy as np
import cv2
import dlib
img = cv2.imread("cr73.png")
detector = dlib.get_frontal_face_detector()
faces =detector(img,0)
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
for face in faces:shape=predictor(img,face)landmarks =np.array([[p.x,p.y]for p in shape.parts()])for idx, point in enumerate(landmarks):pos = (point[0], point[1])cv2.circle(img, pos, 2,color=(0,255, 0),thickness=-1)cv2.putText(img, str(idx),pos,cv2.FONT_HERSHEY_SIMPLEX,0.4,(255,255,255),1,cv2.LINE_AA)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果显示:

四、总结
OpenCV 提供了丰富的关键点定位算法,每种算法都有其特点和适用场景。Harris 角点检测简单快速,适用于对实时性要求较高的场景;SIFT 算法具有尺度和旋转不变性,但计算复杂度较高;ORB 算法结合了速度和性能,是一种较为均衡的选择。
随着计算机视觉技术的不断发展,关键点定位算法也在不断改进和创新。未来,关键点定位将在更多的领域得到应用,如自动驾驶、增强现实等。同时,如何提高关键点定位的准确性和鲁棒性,仍然是研究的热点问题。
相关文章:
OpenCV 关键点定位
一、Opencv关键点定位介绍 关键点定位在计算机视觉领域占据着核心地位,它能够精准识别图像里物体的关键特征点。OpenCV 作为功能强大的计算机视觉库,提供了多种实用的关键点定位方法。本文将详细阐述关键点定位的基本原理,深入探讨 OpenCV 中…...
C++ 重构muduo网络库
本项目参考的陈硕老师的思想 1. 基础概念 进程里有 Reactor、Acceptor、Handler 这三个对象 Reactor 对象的作用是监听和分发事件;Acceptor 对象的作用是获取连接;Handler 对象的作用是处理业务; 先说说 阻塞I/O,非阻塞I/O&…...
SDHC接口协议底层传输数据是安全的
SDHC(Secure Digital High Capacity)接口协议在底层数据传输过程中确实包含校验机制,以确保数据的完整性和可靠性。以下是关键点的详细说明: 物理层与数据链路层的校验机制 物理层(Electrical Layer)&…...
arm_math.h、arm_const_structs.h 和 arm_common_tables.h
在 FOC(Field-Oriented Control,磁场定向控制) 中,arm_math.h、arm_const_structs.h 和 arm_common_tables.h 是 CMSIS-DSP 库的核心组件,用于实现高效的数学运算、预定义结构和查表操作。以下是它们在 FOC 控…...
buuctf sql注入类练习
BUU SQL COURSE 1 1 实例无法访问 / Instance cant be reached at that time | BUUCTF但是这个地方很迷惑就是这个 一个 # 我们不抓包就不知道这个是sql注入类的判断是 get 类型的sql注入直接使用sqlmap我们放入到1.txt中 目的是 优先检测 ?id1>python3 sqlmap.py -r 1.t…...
具身导航中的视觉语言注意力蒸馏!Vi-LAD:实现动态环境中的社会意识机器人导航
作者:Mohamed Elnoor 1 ^{1} 1, Kasun Weerakoon 1 ^{1} 1, Gershom Seneviratne 1 ^{1} 1, Jing Liang 2 ^{2} 2, Vignesh Rajagopal 3 ^{3} 3, and Dinesh Manocha 1 , 2 ^{1,2} 1,2单位: 1 ^{1} 1马里兰大学帕克分校电气与计算机工程系, 2…...
全局前置守卫与购物车页面鉴权
在很多应用里,并非所有页面都能随意访问。例如购物车页面,用户需先登录才能查看。这时可以利用全局前置守卫来实现这一鉴权功能。 全局前置守卫的书写位置在 router/index.js 文件中,在创建 router 对象之后,暴露 router 对象之前…...
vue3 ts 自定义指令 app.directive
在 Vue 3 中,app.directive 是一个全局 API,用于注册或获取全局自定义指令。以下是关于 app.directive 的详细说明和使用方法 app.directive 用于定义全局指令,这些指令可以用于直接操作 DOM 元素。自定义指令在 Vue 3 中非常强大࿰…...
layui 弹窗-调整窗口的缩放拖拽几次就看不到标题、被遮挡了怎么解决
拖拽几次,调整窗口的缩放,就出现了弹出的页面,右上角叉号调不出来了,窗口关不掉 废话不多说直入主题: 在使用layer.alert layer.confirm layer.msg 等等弹窗时,发现看不到弹窗,然后通过控制台检查代码发现…...
网络空间安全(57)K8s安全加固
一、升级K8s版本和组件 原因:K8s新版本通常会引入一系列安全功能,提供关键的安全补丁,能够补救已知的安全风险,减少攻击面。 操作:将K8s部署更新到最新稳定版本,并使用到达stable状态的API。 二、启用RBAC&…...
2025蓝桥杯C++A组省赛 题解
昨天打完蓝桥杯本来想写个 p y t h o n python python A A A 组的题解,结果被队友截胡了。今天上课把 C A CA CA 组的题看了,感觉挺简单的,所以来水一篇题解。 这场 B B B 是一个爆搜, C C C 利用取余的性质比较好写&#…...
论文学习:《通过基于元学习的图变换探索冷启动场景下的药物-靶标相互作用预测》
原文标题:Exploring drug-target interaction prediction on cold-start scenarios via meta-learning-based graph transformer 原文链接:https://www.sciencedirect.com/science/article/pii/S1046202324002470 药物-靶点相互作用(DTI&…...
【题解-洛谷】P1824 进击的奶牛
题目:P1824 进击的奶牛 题目描述 Farmer John 建造了一个有 N N N( 2 ≤ N ≤...
机械革命 无界15X 自带的 有线网卡 YT6801 debian12下 的驱动方法
这网卡是国货啊。。。 而且人家发了驱动程序 Motorcomm Microelectronics. YT6801 Gigabit Ethernet Controller [1f0a:6801] 网卡YT6801在Linux环境中的安装方法 下载网址 yt6801-linux-driver-1.0.29.zip 我不知道别的系统是否按照说明安装就行了 但是debian12不行&…...
十八、TCP多线程、多进程并发服务器
1、TCP多线程并发服务器 服务端: #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h>…...
JAVA中正则表达式的入门与使用
JAVA中正则表达式的入门与使用 一,基础概念 正则表达式(Regex) 用于匹配字符串中的特定模式,Java 中通过 java.util.regex 包实现,核心类为: Pattern:编译后的正则表达式对象。 Matcher&#…...
AIGC-文生图与图生图
在之前的文章中,我们知道了如何通过Web UI和Confy UI两种SD工具来进行图片生成,今天进一步地讲解其中的参数用处及如何调节。 文生图 参数详解 所谓文生图,就是通过文字描述我们想要图片包含的内容。初学的话,还是以Web UI为例…...
量化交易 - 聚宽joinquant - 多因子入门研究 - 源码开源
先看一下我们的收益: JoinQuant直达这里看看 下面讲解原理和代码。 目录 一、是否为st 二、是否停牌 三、市值小、roe大 四、编写回测代码 今天来研究一下多因子回测模型,这里以‘市值’、‘roe’作为例子。 几个标准:沪深300里选股&am…...
本地缓存方案Guava Cache
Guava Cache 是 Google 的 Guava 库提供的一个高效内存缓存解决方案,适用于需要快速访问且不频繁变更的数据。 // 普通缓存 Cache<Key, Value> cache CacheBuilder.newBuilder().maximumSize(1000) // 最大条目数.expireAfterWrite(10, TimeUnit.MINUTES) /…...
虚拟列表react-virtualized使用(npm install react-virtualized)
1. 虚拟化列表 (List) // 1. 虚拟化列表 (List)import { List } from react-virtualized; import react-virtualized/styles.css; // 只导入一次样式// 示例数据 const list Array(1000).fill().map((_, index) > ({id: index,name: Item ${index},description: This is i…...
解释型语言和编译型语言的区别
Python 的执行过程通常涉及字节码,而不是直接将代码编译为机器码。以下是详细的解释: ### **Python 的执行过程** 1. **源代码到字节码**: - Python 源代码(.py 文件)首先被编译为字节码(.pyc 文件&…...
猫咪如厕检测与分类识别系统系列【三】融合yolov11目标检测
✅ 前情提要 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠…...
sql server 字段逗号分割取后面的值
在 SQL Server 中,如果你有一个字段(字段类型通常是字符串),其中包含用逗号分隔的值,并且你想提取这些值中逗号后面的特定部分,你可以使用多种方法来实现这一点。这里我将介绍几种常见的方法: …...
FPGA 37 ,FPGA千兆以太网设计实战:RGMII接口时序实现全解析( RGMII接口时序设计,RGMII~GMII,GMII~RGMII 接口转换 )
目录 前言 一、设计流程 1.1 需求理解 1.2 模块划分 1.3 测试验证 二、模块分工 2.1 RGMII→GMII(接收方向,rgmii_rx 模块) 2.2 GMII→RGMII(发送方向,rgmii_tx 模块) 三、代码实现 3.1 顶层模块 …...
上篇:《排序算法的奇妙世界:如何让数据井然有序?》
个人主页:strive-debug 排序算法精讲:从理论到实践 一、排序概念及应用 1.1 基本概念 **排序**:将一组记录按照特定关键字(如数值大小)进行递增或递减排列的操作。 1.2 常见排序算法分类 - **简单低效型**ÿ…...
红宝书第三十四讲:零基础学会单元测试框架:Jest、Mocha、QUnit
红宝书第三十四讲:零基础学会单元测试框架:Jest、Mocha、QUnit 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、单元测试是什么? 就像给代码做“体检”,帮你检查…...
【JDBC-54.1】MySQL JDBC连接字符串常用参数详解
在Java应用程序中连接MySQL数据库时,JDBC连接字符串是建立连接的关键。一个配置得当的连接字符串不仅能确保连接成功,还能优化性能、增强安全性并处理各种连接场景。本文将深入探讨MySQL JDBC连接字符串的常用参数及其最佳实践。 1. 基本连接字符串格式…...
swagger 注释说明
一、接口注释核心字段 在 Go 的路由处理函数(Handler)上方添加注释,支持以下常用注解: 注解名称用途说明示例格式Summary接口简要描述Summary 创建用户Description接口详细说明Description 通过用户名和邮箱创建新用户Tags接口分…...
CST1019.基于Spring Boot+Vue智能洗车管理系统
计算机/JAVA毕业设计 【CST1019.基于Spring BootVue智能洗车管理系统】 【项目介绍】 智能洗车管理系统,基于 Spring Boot Vue 实现,功能丰富、界面精美 【业务模块】 系统共有三类用户,分别是:管理员用户、普通用户、工人用户&…...
【前端网络请求】XHR封装,支持文件上传、进度监控、混合字段传输
网络请求介绍 XMLHttpRequest(XHR)是前端开发中用于发起网络请求的基础技术。虽然现代开发中常用fetch或axios,但掌握XHR的封装技巧仍能让你更灵活地应对复杂需求。本文将通过一个可复用、功能全面的XHR封装工具,教你实现以下功能: 📤 文件上传(单个/多个文件)📊 实…...
