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.hqwc.cn/news/18956.html

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

相关文章

nginx漏洞修复之检测到目标URL存在http host头攻击漏洞

漏洞说明 为了方便的获得网站域名&#xff0c;开发人员一般依赖于HTTP Host header。例如&#xff0c;在php里用_SERVER[“HTTP_HOST”]。但是这个header是不可信赖的&#xff0c;如果应用程序没有对host header值进行处理&#xff0c;就有可能造成恶意代码的传入。 解决方法…

前端学习——css盒子模型、css3新特性、伪类、布局0711TODO

样式还是得具体使用才能理解&#xff0c;不然会忘记也理解不透彻&#xff1b;还有定位&#xff0c;元素溢出&#xff0c;浮动&#xff0c;布局水平&垂直对齐&#xff1a; css3新特性 1过渡 2 动画 3 2D、3D转换 伪类 三种定位方式 弹性布局/栅格布局

Unity | 向量、矩阵、齐次坐标

目录 一、向量点乘&叉乘 1.点乘 1.1 公式 1.2 几何意义 2.叉乘 2.1 公式 2.2 几何意义 二、矩阵点乘&叉乘 1.矩阵 2.矩阵的点乘 3.矩阵的叉乘 三、矩阵旋转 四、齐次坐标 一、向量点乘&叉乘 1.点乘 又称内积&#xff0c;结果是个标量&#xff0c; 1…

opencv读取图像数据并修改通道转变内存连续

opencv读取图像数据并修改通道转变内存连续

基于vscode的ros开发

Part1前言 ROS&#xff08;机器人操作系统&#xff09;是一个开源的机器人软件平台&#xff0c;旨在提供一套通用的工具和库&#xff0c;帮助开发人员创建机器人应用程序。ROS提供了用于构建机器人系统的库、工具、驱动程序、通信协议和软件包管理系统。 以下是ROS的一些主要特…

安科瑞智能母线监控在数据中心的应用

引言&#xff1a; 近年来&#xff0c;随着母线槽在建筑及工厂的配电中越来越广泛&#xff0c;母线槽场景运用的越多&#xff0c;随着数据中心建设的快速发展和更高需求&#xff0c;智能母线系统逐渐被应用于机房的末端配电中&#xff0c;具有电流小、插接方便、智能化程度高等…

快消品行业企业如何选择适合自己的订单管理系统源码

快消品行业企业在选择适合自己的订单管理系统源码时&#xff0c;需要考虑以下五个方面&#xff1a; 首先&#xff0c;企业需要考虑订单管理系统的功能是否能够满足自身的需求。订单管理系统应该具备订单录入、订单查询、订单处理、订单跟踪、进销存管理、临期提醒等基本功能&am…

sodner 论文复现

论文&#xff1a;A Span-Based Model for Joint Overlapped and DiscontinuousNamed Entity Recognition_pepsi_w的博客-CSDN博客 因为搞这个复现的环境弄了很久才跑通&#xff0c;记录一下。 介绍一下我的环境&#xff1a;window10 cpu pycharm miniconda 1. 下载代码文件&a…

VMware15.5版本虚拟机安装Linux Centos 7系统详细步骤

1.首先准备好Centos7.6安装文件&#xff0c;安装文件可百度搜索或在阿里镜像站中下载。 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 2.新建虚拟机. 1选择自定义&#xff0c;点下一步。 2硬件兼容性选择15.x&#xff0c;&#xff0c;点下一步。 3选择稍后安装操作系统&…

Mac OS 源码编译安装Nginx

下载软件 访问地址&#xff1a; https://nginx.org 根据自己的需求下载合适的安装包 首先建个临时目录 nginx-src 并下载所需软件的源码进行配置 mkdir nginx-src cd nginx-src wget https://nginx.org/download/nginx-1.18.0.tar.gz wget https://ftp.pcre.org/pub/p…

On the Properties of Neural Machine Translation: Encoder–DecoderApproaches

摘要 Neural machine translation &#xff1a; 神经机器翻译。 神经机器翻译模型经常包含编码器和解码器&#xff1a;an encoder and a decoder. 编码器&#xff1a; 从一个变长输入序列中提取固定长度的表示。a fixed-length representation. 解码器&#xff1a;从表示中…

校招失败后,在小公司熬了 2 年终于进了华为,竭尽全力....

其实两年前校招的时候就往华为投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…