opencv实现以图搜图
这里写目录标题
- 1. 步骤
- 1.1 导入OpenCV库:
- 1.2 加载图像
- 1.3 提取特征
- 1.4 匹配特征
- 1.5 显示结果
- 2. 完整代码
- 3. 测试图片及效果
1. 步骤
1.1 导入OpenCV库:
在您的C++代码中,首先需要导入OpenCV库。您可以使用以下语句导入核心模块:
#include <opencv2/core/core.hpp>
1.2 加载图像
使用OpenCV的 imread 函数加载要搜索的图像和目标图像。例如,假设您要搜索的图像是"search_image.jpg",目标图像是"target_image.jpg",您可以使用以下代码加载它们:
cpp
cv::Mat searchImage = cv::imread("search_image.jpg");
cv::Mat targetImage = cv::imread("target_image.jpg");
1.3 提取特征
使用OpenCV的特征提取方法(如SIFT、SURF或ORB)从目标图像中提取特征。例如,使用SIFT算法可以提取特征,您可以使用以下代码:
cv::Ptr<cv::SIFT> sift = cv::SIFT::create();
cv::Mat targetDescriptors;
std::vector<cv::KeyPoint> targetKeypoints;
sift->detectAndCompute(targetImage, cv::noArray(), targetKeypoints, targetDescriptors);
1.4 匹配特征
使用提取的特征在搜索图像中寻找匹配。您可以使用OpenCV的特征匹配方法(如FLANN或Brute-Force)进行匹配。以下是一个使用Brute-Force匹配器的示例:
cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create(cv::DescriptorMatcher::BRUTEFORCE);
std::vector<cv::DMatch> matches;
matcher->match(searchDescriptors, targetDescriptors, matches);
1.5 显示结果
根据匹配结果,您可以选择在搜索图像上绘制匹配的关键点或边界框。以下是一个简单的示例,用于在搜索图像上绘制匹配的关键点:
cv::Mat outputImage;
cv::drawMatches(searchImage, searchKeypoints, targetImage, targetKeypoints, matches, outputImage);
cv::imshow("Matches", outputImage);
cv::waitKey(0);
2. 完整代码
#include <opencv2/core/core.hpp>int search_pic_by_pic()
{// 加载查询图像和目标图像cv::Mat queryImage = cv::imread("E:\\code\\Yolov5_Tensorrt_Win10-master\\pictures\\search_pic_by_pic\\1.png");cv::Mat targetImage = cv::imread("E:\\code\\Yolov5_Tensorrt_Win10-master\\pictures\\search_pic_by_pic\\2.png");// 特征提取cv::Ptr<cv::Feature2D> featureExtractor = cv::SIFT::create();cv::Mat queryDescriptors, targetDescriptors;std::vector<cv::KeyPoint> queryKeypoints, targetKeypoints;featureExtractor->detectAndCompute(queryImage, cv::noArray(), queryKeypoints, queryDescriptors);featureExtractor->detectAndCompute(targetImage, cv::noArray(), targetKeypoints, targetDescriptors);// 特征匹配cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create(cv::DescriptorMatcher::FLANNBASED);std::vector<cv::DMatch> matches;matcher->match(queryDescriptors, targetDescriptors, matches);// 根据匹配结果进行排序std::sort(matches.begin(), matches.end(), [](const cv::DMatch& a, const cv::DMatch& b) {return a.distance < b.distance;});float threshold = 200.0;int numMatches = 0;int matches_size = matches.size();vector< cv::DMatch>::iterator it = matches.begin();for (it; it != matches.end();) {if (it->distance < threshold) {numMatches++;it++;}else {it = matches.erase(it);}}float matchRate = static_cast<float>(numMatches) / matches_size * 100.0;std::cout << "Match Rate: " << matchRate << "%" << std::endl;// 显示匹配结果cv::Mat matchedImage;cv::drawMatches(queryImage, queryKeypoints, targetImage, targetKeypoints, matches, matchedImage);cv::imshow("Matched Image", matchedImage);cv::waitKey(0);return 0;
}int main()
{search_pic_by_pic();return 0;
}
3. 测试图片及效果



相关文章:
opencv实现以图搜图
这里写目录标题 1. 步骤1.1 导入OpenCV库:1.2 加载图像1.3 提取特征1.4 匹配特征1.5 显示结果 2. 完整代码3. 测试图片及效果 1. 步骤 1.1 导入OpenCV库: 在您的C代码中,首先需要导入OpenCV库。您可以使用以下语句导入核心模块:…...
爬虫工作中代理失效了怎么处理?
Hey!亲爱的爬虫小伙伴们,是不是经常在爬虫的工作中遇到代理IP失效的问题?别着急,今天我来分享一些应对代理失效的妙招!这些方法简单易行,让你爬虫顺利进行. 一、为什么代理会失效? 在爬虫过程…...
使用虚拟环境conda安装不同版本的cuda,cudnn,pytorch
背景:在学习深度学习时,我们不可避免的需要跑多个神经网络,而不同的神经网络环境都不一样,所以必须要使用到虚拟环境(如conda)去做环境隔离,安装属于自己的环境。在这环境中,大多神经网络都必须要用到cuda&…...
【24择校指南】华东师范大学计算机考研考情分析
华东师范大学(B) 考研难度(☆☆☆☆) 内容:23考情概况(拟录取和复试分数人数统计)、院校概况、23考试科目、23复试详情、各科目及专业考情分析。 正文2563字,预计阅读:3分钟。 2023考情概况…...
什么是LAXCUS分布式操作系统?
相较Linux、Windows,Laxcus是同时在多台计算机上运行的操作系统,处理大规模、高并发、高性能业务,其特点是资源共享和任务并行,并实现【数存算管】超融合一体化。环境中的资源:CPU、GPU、内存、硬盘、网络,…...
Redis数据结构——链表list
链表是一种常用的数据结构,提供了顺序访问的方式,而且高效地增删操作。 Redis中广泛使用了链表,例如:列表的底层实现之一就是链表。 在Redis中,链表分为两部分:链表信息 链表节点。 链表节点用来表示链表…...
[自学记录06|*百人计划]Gamma矫正与线性工作流
一、前言 Gamma矫正其实也属于我前面落下的一块内容,打算把它补上,其它的没补是因为我之前写的GAMES101笔记里已经涵盖了,而Gamma矫正在101里面确实没提到,于是打算把它补上,这块内容并不难,但是想通透的理…...
【数据结构】二叉树链式结构的实现及其常见操作
目录 1.手搓二叉树 2.二叉树的遍历 2.1前序、中序以及后序遍历 2.2二叉树的层序遍历 3.二叉树的常见操作 3.1求二叉树节点数量 3.2求二叉树叶子节点数量 3.3求二叉树第k层节点个数 3.3求二叉树的深度 3.4二叉树查找值为x的节点 4.二叉树的销毁 1.手搓二叉树 在学习…...
从零实战SLAM-第九课(后端优化)
在七月算法报的班,老师讲的蛮好。好记性不如烂笔头,关键内容还是记录一下吧,课程入口,感兴趣的同学可以学习一下。 --------------------------------------------------------------------------------------------------------…...
Python Opencv实践 - 图像金字塔
import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像上采样 #cv.pyrUp(src, dstNone, dstsizeNone, borderTypeNone) #参考资料:https://blo…...
Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C++)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C) Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK设置相机固定帧…...
计算机竞赛 python+大数据校园卡数据分析
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于yolov5的深度学习车牌识别系统实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖&am…...
DNNGP模型解读-early stopping 和 batch normalization的使用
一、考虑的因素(仅代表个人观点) 1.首先我们看到他的这篇文章所考虑的不同方面从而做出的不同改进,首先考虑到了对于基因组预测的深度学习方法的设计 ,我们设计出来这个方法就是为了基因组预测而使用,这也是主要目的&…...
【目标检测】目标检测 相关学习笔记
目标检测算法 PASCALVOC2012数据集 挑战赛主要分为 图像分类 目标检测 目标分割 动作识别 数据集分为四个大类 交通(飞机 船 公交车 摩托车) 住房(杯子 椅子 餐桌 沙发) 动物(鸟 猫 奶牛 狗 马 羊) 其他&a…...
面试攻略,Java 基础面试 100 问(十六)
反射使用步骤(获取Class对象、调用对象方法) 获取想要操作的类的Class对象,他是反射的核心,通过Class对象我们可以任意调用类的方法。 调用 Class 类中的方法,既就是反射的使用阶段。 使用反射 API 来操作这些信息。 什么是 java 序列化&…...
章节5:脚本注入网页-XSS
章节5:脚本注入网页-XSS XSS :Cross Site Script 恶意攻击者利用web页面的漏洞,插入一些恶意代码,当用户访问页面的时候,代码就会执行,这个时候就达到了攻击的目的。 JavaScript、Java、VBScript、Activ…...
ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031)
安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) 二、CVE-2017-15031 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) Title 未初始化或保存/恢复PMCR_EL0可能会泄露安全世界的时间信息 CVE ID CVE-2017-1503…...
迅捷视频工具箱:多功能音视频处理软件
这是一款以视频剪辑、视频转换、屏幕录像等特色功能为主,同时附带有视频压缩、视频分割、视频合并等常用视频处理功能为主的视频编辑软件。该软件操作简单易用,即使没有视频处理经验的用户也可以轻松上手。将视频添加到工具箱对应功能后,简单…...
linux--fork()详解
fork() 参考链接:链接 进程控制原语包括:进程的建立、进程的撤销、进程的等待和进程的唤醒。 fork,在英语用译为叉子,形状像Y,反过来就如下图: 就是本来只有一个进行app,然后它调用了fork()函数…...
go_并发编程(1)
go并发编程 一、 并发介绍1,进程和线程2,并发和并行3,协程和线程4,goroutine 二、 Goroutine1,使用goroutine1)启动单个goroutine2)启动多个goroutine 2,goroutine与线程3࿰…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
