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. 測試圖片及效果

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40164.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能算法-SVM, KNN

目錄 SVM, KNN區別 一、KNN算法概述 算法的描述: 二、關于K的取值 K的取法: 三、關于距離的選取 Euclidean Distance 定義: 四、總結 SVM, KNN區別

化繁為簡,使用Hibernate Validator實現參數校驗

前言 在之前的悅享校園的開發中使用了SSM框架&#xff0c;由于當時并沒有使用參數參數校驗工具&#xff0c;方法的入參判斷使用了大量的if else語句&#xff0c;代碼十分臃腫&#xff0c;因此最近在重構代碼時&#xff0c;將框架改為SpringBoot后&#xff0c;引入了Hibernate V…

有一種新型病毒在 3Ds Max 環境中傳播,如何避免?

3ds Max渲染慢&#xff0c;可以使用渲云渲染農場&#xff1a; 渲云渲染農場解決本地渲染慢、電腦配置不足、緊急項目渲染等問題&#xff0c;可批量渲染&#xff0c;批量出結果&#xff0c;速度快&#xff0c;效率高。 此外3dmax支持的CG MAGIC插件專業版正式上線&#xff0c;…

機器學習筆記(1):機器學習入門的概念

導航 一、 人工智能&#xff0c;機器學習&#xff0c;深度學習和傳統學習二、數學基礎三、編程語言 如果你剛剛入門機器學習&#xff0c;會接觸到了非常多的概念。比如人工智能&#xff0c;機器學習&#xff0c;深度學習&#xff0c;神機網絡&#xff0c;強化學習&#xff0c;各…

0基礎學習VR全景平臺篇 第85篇:智慧眼-如何分配角色的權限?

一、功能說明 角色權限&#xff0c;是指給智慧眼的所有角色成員分配具體的操作權限。 二、后臺編輯界面 1、點擊“添加權限”&#xff0c;選擇其可操作的“權限”。注意權限只能逐項選擇&#xff0c;所以如果某個角色擁有多項權限的話&#xff0c;那么需要進行多次添加。“快…

uniapp app 實現右上角回首頁;點homeButton返回上一頁;onNavigationBarButtonTap不生效問題

場景&#xff1a; app&#xff0c;Android移動端 實現點擊右上角圖標&#xff0c;回首頁。 問題&#xff1a;用了官網的 homeButton&#xff0c;圖標正常展示了&#xff0c;也可點擊&#xff0c;但每次點擊后是會返回上一頁而非首頁。 后來查到說&#xff0c;要結合onNavigatio…

linux兩臺服務器互相備份文件(sshpass + crontab)

crontab crontab是linux系統自帶的定時調度軟件&#xff0c;可用于設置周期性被執行的指令&#xff0c;一般用在每天的非高峰負荷時間段運行作業&#xff0c;可在無需人工干預的情況下運行作業。支持在一周或一月中的不同時段運行。 crontab命令允許用戶提交、編輯或刪除相應的…

滴滴Ceph分布式存儲系統優化之鎖優化

摘自&#xff1a;https://mp.weixin.qq.com/s/oWujGOLLGItu1Bv5AuO0-A 2020-09-02 21:45 0.引言 Ceph是國際知名的開源分布式存儲系統&#xff0c;在工業界和學術界都有著重要的影響。Ceph的架構和算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat…

Transformers架構系列---transformers庫的使用

Transformers最初是由Google發布的論文 Attention is All You Need (2017) 提出的一種新的深度學習網絡架構,這篇論文證明了序列模型(如 LSTM)可以完全被注意力機制取代,甚至可以獲得更好的性能。Transformers網絡結構自2017年提出之后僅僅一兩年的時間內就一直在NLP領域及…

Vue:使用Promise.all()方法并行執行多個請求

在Vue中&#xff0c;可以使用Promise.all()方法來并行執行多個請求。當需要同時執行多個異步請求時&#xff0c;可以將這些請求封裝為Promise對象并使用Promise.all()方法來執行它們。 示例1&#xff1a; 以下是一個示例代碼&#xff0c;展示了如何通過Promise.all()方法并行…

C語言——動態內存管理

動態內存管理詳解 前言&#xff1a;一、為什么存在動態內存分配二、動態內存函數2.1malloc函數2.2calloc函數2.3realloc函數2.4free函數 三、常見的動態內存錯誤3.1 對NULL指針解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放動態開辟…

Unity UI內存泄漏優化

項目一運行&#xff0c;占用的內存越來越多&#xff0c;不會釋放&#xff0c;導致GC越來越頻繁&#xff0c;越來越慢&#xff0c;這些都是為什么呢&#xff0c;今天從UI方面談起。 首先讓我們來聊聊什么是內存泄漏呢&#xff1f; 一般來講內存泄漏就是指我們的應用向內存申請…

Rabbitmq消息不丟失

目錄 一、消息不丟失1.消息確認2.消息確認業務封裝2.1 發送確認消息測試2.2 消息發送失敗&#xff0c;設置重發機制 一、消息不丟失 消息的不丟失&#xff0c;在MQ角度考慮&#xff0c;一般有三種途徑&#xff1a; 1&#xff0c;生產者不丟數據 2&#xff0c;MQ服務器不丟數據…

設計HTML5列表和超鏈接

在網頁中&#xff0c;大部分信息都是列表結構&#xff0c;如菜單欄、圖文列表、分類導航、新聞列表、欄目列表等。HTML5定義了一套列表標簽&#xff0c;通過列表結構實現對網頁信息的合理排版。另外&#xff0c;網頁中還包含大量超鏈接&#xff0c;通過它實現網頁、位置的跳轉&…

C語言“牽手”微店商品詳情數據方法,微店商品詳情API接口申請指南

微店平臺的商品詳情通常包括以下信息&#xff1a; 商品名稱&#xff1a;展示商品的名稱&#xff0c;用于描述商品的特性和分類。 商品圖片&#xff1a;展示商品的圖片&#xff0c;可以有多張圖片以展示不同角度和細節。 商品價格&#xff1a;顯示商品的銷售價格&#xff0c;可…

nodejs服務后臺持續運行三種方法

nodejs服務后臺持續運行三種方法 一、利用 forever 推薦 forever是一個nodejs守護進程&#xff0c;完全由命令行操控。forever會監控nodejs服務&#xff0c;并在服務掛掉后進行重啟。 1、安裝 forever npm install forever -g 2、啟動服務 service forever start 3、使用…

小程序CSS button按鈕自定義高度之后不居中

問題&#xff1a; 按鈕設置高度后不居中 <view><button class"btn1" size"">Save</button> </view> page {font-size: 30rpx; }.btn1 {margin-top: 100rpx;height: 190rpx;background: linear-gradient(90deg, #FF8A06, #FF571…

Wi-Fi 安全在學校中的重要性

Wi-Fi 是教育機構的基礎設施&#xff0c;從在線家庭作業門戶到虛擬教師會議&#xff0c;應有盡有。大多數 K-12 管理員對自己的 Wi-Fi 網絡的安全性充滿信心&#xff0c;并認為他們現有的網絡安全措施已經足夠。 不幸的是&#xff0c;這種信心往往是錯誤的。Wi-Fi 安全雖然經常…

【數據結構OJ題】鏈表中倒數第k個結點

原題鏈接&#xff1a;https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId13&&tqId11167&rp2&ru/activity/oj&qru/ta/coding-interviews/question-ranking 目錄 1. 題目描述 2. 思路分析 3. 代碼實現 1. 題目描述 2. 思路分析 …