OpenCV(图像处理)-图片搜索

在这里插入图片描述

图片搜索

  • 1.知识介绍
  • 2.实现流程
  • 2.1 计算特征点与描述子
  • 2.2 描述子的匹配
    • 2.3 求出单应性矩阵并画出轮廓
    • 2.4 将特征点标出
  • 此篇博客作者仍在探索阶段,还有一些模糊的概念没有弄懂,请读者自行分辨。

1.知识介绍

Opencv进行图片搜索需要的知识有:特征点匹配+单应性矩阵知识,特征点匹配作者前面文章有记录。
单应性矩阵:两个不同视角上的点所对应的单应性矩阵可以用同一个射影变换来表述可以简单理解为变换矩阵H,x1 = h*x2

2.实现流程

2.1 计算特征点与描述子

分别计算查询图片和训练图片的特征点和特征点的描述子,为后面进行特征点的匹配作准备,使用ORB算法来实现。

# 读取两个图片
img1 = cv2.imread('./image/opencv_search.png')
img2 = cv2.imread('./image/opencv_orig.png')# 转换为灰度图
g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 创建ORB对象
orb = cv2.ORB_create()# 对orb特征点检测与描述子计算 ,特征点为KeyPoint
kp1, dst1 = orb.detectAndCompute(g1, None)
kp2, dst2 = orb.detectAndCompute(g1, None)

2.2 描述子的匹配

创建FLANN的匹配器进行匹配,然后根据比例筛选所有符合条件的匹配项。

# 创建FLANN所需要的参数
FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH,table_number=6,key_size=12,multi_probe_level=1)
search_params = dict(checks=100)# 创建FLANN匹配器
flann = cv2.FlannBasedMatcher(index_params, search_params)# 进行匹配子计算, matches是一个元组
matches = flann.knnMatch(dst1, dst2, k=2)
# print(matches)
# 根据比率测试所有符合符合条件的匹配项
good = []
for m, n in matches:if m.distance < 0.7*n.distance:good.append(m)

2.3 求出单应性矩阵并画出轮廓

根据匹配的描述子来求单应性矩阵(3*3),然后根据透视变换来求出在训练集上的轮廓,并画出来

if len(good) > 10:# 寻找单应性矩阵src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1, 1, 2)dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1, 1, 2)# M即为单应性矩阵(可以理解就是变换矩阵)  x1 = M*x2M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)# 将mask拉成一维数组,并转换成列表的形式matchesMask = mask.ravel().tolist()h, w, d = img1.shape# 绘制矩形的四个坐标点pts = np.float32([ [0, 0], [0, h-1], [w-1, h-1], [w-1, 0] ]).reshape(-1, 1, 2)# 求透视变换的矩阵,求训练图中的部分,求出轮廓边缘dst = cv2.perspectiveTransform(pts, M)# 在图2上画矩形img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
else:print(f"Not enough matches are found - {len(good)} / {10}")matchesMask = None

2.4 将特征点标出

draw_params = dict(matchColor=(0, 255, 0),singlePointColor=(255, 0, 0),matchesMask=matchesMask,flags=cv2.DrawMatchesFlags_DEFAULT)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)cv2.imshow('img3', img3)
cv2.waitKey(0)

在这里插入图片描述
参考链接: openCV翻译文档

此篇博客作者仍在探索阶段,还有一些模糊的概念没有弄懂,请读者自行分辨。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode-每日一题【147.对链表进行插入排序】

题目 给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表。 每次迭代中&#xff0c;插入排序…

青岛大学_王卓老师【数据结构与算法】Week05_09_顺序栈的操作3_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…

ELK搭建

ELK介绍&#xff1a; ELK是一组开源工具的缩写&#xff0c;它由Elasticsearch、Logstash和Kibana三个组件组成&#xff0c;用于处理、分析和可视化大量日志数据。 入门级ELK搭建&#xff08;无Docker环境&#xff09; 安装前准备 1.获取安装包 https://artifacts.elastic…

Objective-C 父元素和子元素的点击事件

场景&#xff1a; &#xff08;需求1&#xff09;pageA一开始是【默认模式】&#xff0c;点击父元素view&#xff08;包括【搜索】文字&#xff09;&#xff0c;进入【搜索模式】&#xff1b; &#xff08;需求2&#xff09;在pageA中&#xff0c;点击【取消】文字时&#xff…

MySQL入门

MySQL基础 1. 下载MySQL1.1 下载补丁1.2 下载MySQL1.3 确定下载路径1.4 创建配置文件1.5 初始化MySQL 2. 启动MySQL2.1临时启动2.2 制作成Windows服务2.3 连接测试2.4 配置环境变量 3. MySQL指令3.1 连接3.2 设置密码3.3 查看已有的的文件夹&#xff08;数据库&#xff09;3.4 …

Mysql DQL 学习记录

DQL&#xff0c;data query language&#xff0c;即数据查询语言&#xff0c;用来查询数据库中表的记录 1.基本查询 //查询多个字段 select 字段1&#xff0c;字段2&#xff0c;... from 表名;//查询所有字段&#xff08;扫全表&#xff0c;尽量不要使用&#xff09; select …

如何快速制作一个奶茶店小程序商城

如果你是一个奶茶店的老板&#xff0c;你可能会考虑开设一个小程序商城来增加销售渠道和提升品牌形象。那么&#xff0c;如何快速制作一个奶茶店小程序商城呢&#xff1f;下面我们将介绍一个简单的步骤供你参考。 首先&#xff0c;你需要登录乔拓云平台进入商城后台管理页面。在…

(四)Flask——配置详解

一、配置&#xff1a; Flask中的配置文件是一个flask.config.Config对象&#xff08;继承字典&#xff09;。后续会剖析源码瞅瞅。 基本方法&#xff1a; 直接设置配置项——可以直接在应用程序中设置配置项&#xff0c;而不使用配置文件或环境变量。例如&#xff0c;在应用…

用ChatGPT解析Wireshark抓取的数据包样例

用Wireshark抓取的数据包&#xff0c;常用于网络故障排查、分析和应用程序通信协议开发。其抓取的分组数据结果为底层数据&#xff0c;看起来比较困难&#xff0c;现在通过chatGPT大模型&#xff0c;可以将原始抓包信息数据提交给AI进行解析&#xff0c;本文即是进行尝试的样例…

互联网行业真的不行了吗?

文章目录 前言一、起因二、互联网真的完了吗&#xff1f;三、是不是要转行&#xff1f;四、十年磨一剑五、统一回复 前言 英雄算法联盟 - 七月集训 已经开始 16 天&#xff0c;八月算法集训 将于 08月01日 正式开始&#xff0c;目前已经提前开始报名&#xff0c;报名方式参见&a…

OpenCv之滤波器

目录 一、卷积 二、方盒滤波与均值滤波 三、高斯滤波 四、中值滤波 五、双边滤波 一、卷积 图像卷积就是卷积核在图像上按行华东遍历像素时不断的相乘求和的过程 相关知识点: 步长:就是卷积核在图像上移动的步幅.(为充分扫描图片&#xff0c;步长一般为1)padding:指在图片…

matlab学习指南(1):matlab初步入门详细介绍

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;联系最后的横幅&#xff01; 喜欢的朋友可以关注下&#xff0c;私信下次更新不迷路&#xff0…

sqlite3交叉编译

1、交叉编译sqllite3可以先从官网下载最新最新的源码进行编译。sqlite3下载sqlite3有两种版本的源代码&#xff0c;sqlite-amalgamation-3420000.zip这种是将所有的操作放到sqlite3中进行使用的。虽然官方推荐使用这种方法。但是对于嵌入式移植还是使用sqlite-autoconf-3420000…

探索基于300W-LP的3D人脸关键点检测

目录 前言一、&#xff13;D 关键点可视化二、使用步骤1.300W-LP转为YOLO数据格式2.修改数据入口3.开始训练 总结 前言 300WLP数据集提供来丰富的人脸线索&#xff0c;包括&#xff12;D或&#xff13;D的关键点信息&#xff0c;Head Angle和&#xff13;DMM的参数等&#xff…

OpenCV中的RGB与YUV转换

1 基本概念 YUV 颜色空间从模拟电视时代开始就被广泛应用于彩色图像的转换与处理。其基于一个 3x3 的矩阵&#xff0c;通过线性变换将 RGB 像素转换为一个亮度&#xff08;Luma&#xff09;分量 Y 以及两个色度&#xff08;Chroma&#xff09;分量 U 和 V。由于模拟电视存在着多…

Java如何使用Fastjson序列化和反序列化

技数未来 各种数据库等知识文章 Fastjson是阿里巴巴开源的一个高性能的JSON处理框架&#xff0c;它可以实现Java对象与JSON字符串之间的相互转换&#xff0c;支持复杂对象嵌套和泛型的序列化与反序列化。Fastjson具有以下特点&#xff1a; 1. 快速&#xff1a;Fastjson相对于…

K8s 为什么要弃用 Docker

K8s 为什么要弃用 Docker 最近在学习容器技术的过程中&#xff0c;看到有关于Kubernetes“弃用 Docker”的事情&#xff0c;担心现在学 Docker 是否还有价值&#xff0c;是否现在就应该切换到 containerd 或者是其他 runtime。 随着深入了解&#xff0c;这些疑虑的确是有些道理…

libbpf-bootstrap开发指南:socket 监测与过滤 - sockfilter

目录 代码分析 comm 数据部分 BPF 代码部分 功能说明 rb 结构分析 ip_is_fragment 函数分析 bpf_skb_load_bytes函数分析 GRE协议说明 用户代码部分 功能说明 open_raw_sock& 原始套接字 setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(pr…

git 工具使用--分支管理

git 工具使用–分支管理 文章目录 git 工具使用--分支管理理解分支创建分支切换分支合并分支删除分支合并冲突分支管理策略分支策略bug分支删除临时分支总结 理解分支 分支管理是Git的杀手级功能之一。分支&#xff1a;就是科幻中的平行宇宙&#xff0c;当你正在电脑面前学习C…

设计模式-单例模式

面向对象语言讲究的是万物皆对象。通常流程是先定义可实例化类&#xff0c;然后再通过各种不同的方式创建对象&#xff0c;因此类一般可以实例化出多个对象。但是实际项目开发时&#xff0c;我们还是希望保证项目运行时有且仅包含一个实例对象。这个需求场景的出发点包括但不限…