【计算机视觉算法与应用】模板匹配、图像配准
目录
1. 基于灰度值的模板匹配
2. 基于相关性的模板匹配
3. 基于形状的模板匹配
4. 基于组件的模板识别
5. 基于形变的模板匹配
6. 基于描述符的模板匹配
7. 基于点的模板匹配
性能比较
模板匹配的算法实现需要结合具体需求和应用场景来选择方法。以下是基于 OpenCV 的实现示例,用于实现以下模板匹配方法:
1. 基于灰度值的模板匹配
使用 OpenCV 的 cv2.matchTemplate 方法进行模板匹配。
import cv2
import numpy as np# 加载图像和模板
image = cv2.imread('image.jpg', 0)
template = cv2.imread('template.jpg', 0)
w, h = template.shape[::-1]# 匹配方法
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)# 结果
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(image, top_left, bottom_right, 255, 2)
cv2.imshow('Matched Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 基于相关性的模板匹配
相关性匹配也可以基于 cv2.matchTemplate,但使用不同的匹配模式。
result = cv2.matchTemplate(image, template, cv2.TM_CCORR_NORMED)
# 剩余代码与上面类似
3. 基于形状的模板匹配
使用 Canny 边缘检测和轮廓匹配。
# 提取轮廓
edges_image = cv2.Canny(image, 100, 200)
edges_template = cv2.Canny(template, 100, 200)# 轮廓匹配
contours_image, _ = cv2.findContours(edges_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours_template, _ = cv2.findContours(edges_template, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)similarity = cv2.matchShapes(contours_template[0], contours_image[0], cv2.CONTOURS_MATCH_I1, 0.0)
print(f"Shape Similarity: {similarity}")
4. 基于组件的模板识别
使用连通组件(Connected Components)。
# 连通组件
_, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8)# 遍历组件
for i in range(1, len(stats)):x, y, w, h, area = stats[i]if area > 50: # 根据模板特性过滤cv2.rectangle(image, (x, y), (x + w, y + h), 255, 2)cv2.imshow('Components', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 基于形变的模板匹配
形变模板匹配需要形变模型,比如 Thin Plate Splines 或其他变换。
from skimage.transform import warp
from skimage import data# 定义形变模型
def deform(image):# 示例:平移或旋转return warp(image, lambda xy: (xy[0] + 10, xy[1] + 10))transformed_template = deform(template)
result = cv2.matchTemplate(image, transformed_template, cv2.TM_CCOEFF_NORMED)
6. 基于描述符的模板匹配
使用 ORB 特征点和描述符。
# ORB 初始化
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(image, None)
kp2, des2 = orb.detectAndCompute(template, None)# 特征匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)# 画出匹配结果
result = cv2.drawMatches(image, kp1, template, kp2, matches[:10], None, flags=2)
cv2.imshow('Descriptor Matching', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
7. 基于点的模板匹配
使用特征点检测方法,比如 FAST。
fast = cv2.FastFeatureDetector_create()
kp1 = fast.detect(image, None)
kp2 = fast.detect(template, None)# 可视化特征点
image_with_kp = cv2.drawKeypoints(image, kp1, None, color=(255, 0, 0))
template_with_kp = cv2.drawKeypoints(template, kp2, None, color=(255, 0, 0))cv2.imshow('Image Keypoints', image_with_kp)
cv2.imshow('Template Keypoints', template_with_kp)
cv2.waitKey(0)
cv2.destroyAllWindows()
性能比较
可以通过以下指标进行比较:
- 匹配时间:统计每种方法的运行时间。
- 准确性:计算匹配的正确率(例如 IoU 或精确定位的得分)。
- 鲁棒性:在旋转、缩放和噪声下的表现。
如需详细的性能比较,可以写一段代码封装测试和比较逻辑。需要时我可以帮助扩展测试脚本!
个人经验:
1. 工业场景几何关系明确,可以用 基于图像(相关性的就够了),测试显示,对
2. 形变,投影变换,可以考虑用特征点提取(ORB, SIFT)提取描述子, 配合匹配关系描述子配对关系计算获得。 c++ 中设计找最近点等优化算法,ranscac 去除异常点等手段。
3. 工业场景中,多用基于shape model 的查找。更稳定,速度更快(tamplate 小, 几十毫秒)
欢迎订阅本专辑,关注博主,持续更新 ~!code实战内容和经验!代码和理论即学即用!
相关文章:
【计算机视觉算法与应用】模板匹配、图像配准
目录 1. 基于灰度值的模板匹配 2. 基于相关性的模板匹配 3. 基于形状的模板匹配 4. 基于组件的模板识别 5. 基于形变的模板匹配 6. 基于描述符的模板匹配 7. 基于点的模板匹配 性能比较 模板匹配的算法实现需要结合具体需求和应用场景来选择方法。以下是基于 OpenCV 的…...
【Linux】设计文件系统(C实现)
要求: (1)可以实现下列几条命令 dir 列文件目录 create 创建文件 delete 删除文件 read 读文件 write 写文件 (2)列目录时要列出文件名、存取权限(八进制)、文件长度、时间(创建时间,修改时间以及…...
详解Rust多线程编程
文章目录 多线程模型创建和管理线程自定义线程行为线程传递数据线程间通信线程池错误处理与线程Condvar(条件变量)无锁并发高性能并发库 Rust的多线程编程提供了一种安全、高效的方式来进行并发操作。Rust的并发性设计原则之一是确保线程安全,同时避免运行时的开销&…...
el-upload上传多个文件,一次请求,Django接收
1、:file-list"fileList" :on-change"handleChange" 将文件赋值到fileList 2、 :auto-upload"false" 手动触发上传 写个按钮点击执行这个 this.$refs.upload.submit(); 3、自己写上传,不会再触发上传成功或失败回调 4、 request.FI…...
Python实现网站资源批量下载【可转成exe程序运行】
Python实现网站资源批量下载【可转成exe程序运行】 背景介绍解决方案转为exe可执行程序简单点说详细了解下 声明 背景介绍 发现 宣讲家网 的PPT很好,作为学习资料使用很有价值,所以想下载网站的PPT课件到本地,但是由于网站限制,一…...
《JavaScript高级程序设计》读书笔记 20
感谢点赞、关注和收藏! 原始值包装类型 为了方便操作原始值,ECMAScript 提供了 3 种特殊的引用类型:Boolean、Number 和 String。每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象,从而暴露…...
ASP.NET Core项目中使用SqlSugar连接多个数据库的方式
之前学习ASP.NETCore及SqlSugar时都是只连接单个数据库处理数据,仅需在Program文件中添加ISqlSugarClient的单例即可(如下代码所示)。 builder.Services.AddSingleton<ISqlSugarClient>(s > {SqlSugarScope sqlSugar new SqlSugar…...
Java面试八股文(精选、纯手打)
全国内大厂Java面试高频题库 本小册内容涵盖:Java基础,JVM,多线程,数据库(MySQL/Redis)SSM,Dubbo,网络,MQ,Zookeeper,Netty,微服务&a…...
工程设计行业内外网文件交换解决方案:FileLink助力高效、安全的跨网协作
在工程设计行业,文件交换和信息共享是项目顺利推进的关键。尤其是涉及复杂的设计图纸、技术方案、合同文件等重要资料时,如何确保文件在内外网之间的高效、安全传输,直接影响到项目的进度和质量。FileLink正是为此而生,它为工程设…...
Qt 2D绘图之三:绘制文字、路径、图像、复合模式
参考文章链接: Qt 2D绘图之三:绘制文字、路径、图像、复合模式 绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象…...
配置宝塔php curl 支持http/2 发送苹果apns消息推送
由于宝塔面板默认的php编译的curl未加入http2的支持,如果服务需要使用apns推送等需要http2.0的访问就会失败,所以重新编译php让其支持http2.0 编译方法: 一、安装nghttp2 git clone https://github.com/tatsuhiro-t/nghttp2.git cd nghttp…...
Redis服务配置文件 redis.conf 更新修改配置参数说明
场景: 在安装redis服务中,默认的配置项通常不能实际使用,需要修改一些配置参数 修改配置参数 1、拿到 redis.cnf 文件,此文件通常在 redis 项目源码的第一级目录下 2、修改配置内容,主要修改项如下 protect…...
Android 俩个主题的不同之处 “Theme.AppCompat vs android:Theme.Material.Light.NoActionBar”
这两种主题继承关系有明显的不同,具体区别如下: Theme.AppCompat vs android:Theme.Material.Light.NoActionBar Theme.AppCompat 是 AppCompat 支持库提供的主题,目的是提供向后兼容的支持,适用于较早版本的 Android(…...
Redis+Caffeine 多级缓存数据一致性解决方案
RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战,文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能,但是可能会出现缓存一致性问题。如果数据频繁的变更,可能会导…...
vscode ctrl+/注释不了css
方式一.全部禁用插件排查问题. 方式二.打开首选项的json文件,注释掉setting.json,排查是哪一行配置有问题. 我的最终问题:需要将 "*.vue": "vue",改成"*.vue": "html", "files.associations": { // "*.vue": &qu…...
《山海经》:北山
《山海经》:北山 北山一经单狐山求如山(水马:形状与马相似,滑鱼:背部红色)带山(䑏疏:似马,一只角,鵸鵌:状乌鸦五彩斑斓,儵鱼ÿ…...
oracle中删除指定前缀的表
近期接手做的项目,发觉数据库中有许多多余的表。究其原因,应该是同事贪图方便,将过去做过的项目复制粘贴,然后修修改改。包括数据库也是克隆过来的,然后又没有删除本项目多余的表,结果经过几个轮回…...
解决 Flutter Dio合并请求多个接口,如果一个接口500,那么导致其他请求不在执行
Flutter Dio如何自定义拦截异常 应用场景 我们一般会统一拦截DioExceptionType 如400,403,500 等错误 但有时候,有个地方合并请求多个接口,如果一个接口500,那么导致其他请求不在执行,因为统一拦截了500&…...
The selected directory is not a valid home for Go SDK
在idea里配置go语言的环境时,选择go语言的安装目录,一直提示这个 The selected directory is not a valid home for Go SDK后来查了一下,发现原来idea识别不出来 需要改一下配置文件,找到go环境的安装目录,我是默认安…...
基于云模型的车辆行驶速度估计算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于云模型的车辆行驶速度估计算法matlab仿真。在智能交通系统中,车辆行驶速度的准确估计对于交通流量监测、安全预警、自动驾驶辅助等方面具有极为重…...
不止于检测:如何用FastAPI和VUE3给你的YOLO行人识别系统加上数据大屏、模型管理和AI聊天?
从算法Demo到商业级系统:基于FastAPI与VUE3的智能检测平台架构实战 当你的YOLO模型能在测试集上跑出漂亮指标时,下一个问题自然浮现:如何让这个算法真正产生业务价值?我们见过太多优秀的检测模型被困在Jupyter Notebook里…...
18.children 这个 props 的意义何在?该怎样正确使用?
在 React 里,children 是一个非常特殊、非常常用的 prop, 它专门用来接收:写在组件标签中间的那一部分内容。你可以把它理解为:组件外层负责搭“外壳”,children 负责装进这个壳里的“内容物”。一、children 到底是什…...
simia_joystick:面向心理生理实验的低延迟摇杆驱动设计
1. simia_joystick 组件深度解析:面向嵌入式心理生理交互系统的摇杆驱动设计1.1 组件定位与工程目标simia_joystick是专为simia embedded嵌入式平台设计的摇杆(Joystick)输入组件,其核心使命并非通用HID设备模拟,而是服…...
永磁同步电机参数辨识全解析:从原理到代码实现
永磁同步电机参数辨识 提供原理图、PCB和BOM表及文档说明 永磁同步电机参数辨识 包括初始位置检测,编码器零点位置、方向辨识; 包括电机极对数、电阻、电感、磁链、反电势常数、编码器零位等 包括源C代码,代码详细注释文档,可见…...
COMSOL水力压裂岩石多裂隙损伤耦合模型及含离散裂隙Matlab建模文件
comsol水力压裂岩石多裂隙损伤耦合模型,含离散裂隙matlab建模文件地下三千米的页岩层正在经历一场暴力美学——高压水柱像手术刀般精准切开岩石,形成错综复杂的裂缝网络。这个看似野蛮的过程背后,隐藏着流-固-损伤三场耦合的精密舞蹈。今天我…...
2025届必备的降AI率神器推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 此刻知网已然集成了AI检测功能,是针对学术文本里的人工智能生成痕迹去做识别的。…...
计算机毕业设计:Python二手车可视化平台 Django框架 可视化 线性回归 数据分析 机器学习 深度学习 AI 大模型(建议收藏)✅
1、项目介绍 技术栈 Python语言、Django框架、ECharts可视化库、机器学习线性回归预测算法、HTML、训练集与测试集划分、模型评估(均方误差MSE) 功能模块数据可视化分析大屏城市和车型分析里程与价格分析上牌日期分析和颜色分析词云图分析数…...
如何使用 ECharts 绘制 K 线图
在金融数据可视化领域,K 线图(又称蜡烛图)是展示股票、期货等价格走势的核心工具。它通过矩形实体和上下影线直观呈现开盘价、收盘价、最高价和最低价,帮助投资者快速捕捉市场趋势。本文将结合 ECharts 的官方文档和实战案例&…...
打破语言壁垒:Translumo屏幕实时翻译终极指南
打破语言壁垒:Translumo屏幕实时翻译终极指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 还在为看不懂游戏…...
Comsol仿真:三相电力变压器电磁场与电路耦合计算,精确预测高低压绕组电压电流分布及磁通密度分布
comsol三相电力变压器电磁场和电路耦合计算,可以得到变压器高低压绕组电压电流分布以及变压器磁通密度分布,今天我们来聊聊如何在COMSOL中模拟三相电力变压器的电磁场和电路耦合计算。通过这个模拟,我们可以得到变压器高低压绕组的电压电流分…...
