OpenCV實現感知哈希(Perceptual Hash)算法的類cv::img_hash::PHash

  • 操作系統:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 編程語言:C++11

算法描述

PHash是OpenCV中實現感知哈希(Perceptual Hash)算法的類。該算法用于快速比較圖像的視覺相似性。它將圖像壓縮為一個簡短的哈希值(通常為64位),可用于圖像去重、版權識別、內容匹配等場景。

PHash 基于圖像的低頻信息(通過 DCT 變換提取)來生成哈希值,對輕微的噪聲、縮放和旋轉具有一定的魯棒性。

成員函數

virtual void compute (InputArray input, OutputArray output)

參數說明:

  • input:輸入圖像(支持灰度圖或彩色圖,建議先轉換為灰度圖以提高一致性)。
  • output:輸出哈希值,類型為 CV_8U,長度通常是 8 字節(64 位)。

功能:
計算輸入圖像的 PHash 哈希值,并保存到 output 中。

virtual double compare (InputArray hash1, InputArray hash2)

參數說明:

  • hash1, hash2:兩個哈希值(必須是相同格式的 8 字節數組)。

返回值:兩個哈希之間的漢明距離(Hamming Distance),表示差異程度。數值越小表示圖像越相似。

功能:

比較兩個哈希值的相似性,常用于判斷兩幅圖像是否“看起來一樣”。

代碼示例

#include <opencv2/img_hash.hpp>
#include <opencv2/opencv.hpp>int main()
{// 加載圖像cv::Mat img1 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/img1.jpg", cv::IMREAD_GRAYSCALE );cv::Mat img2 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/img2.jpg", cv::IMREAD_GRAYSCALE );if ( img1.empty() || img2.empty() ){std::cerr << "無法加載圖像" << std::endl;return -1;}// 創建 PHash 算法對象cv::Ptr< cv::img_hash::PHash > phash = cv::img_hash::PHash::create();// 計算哈希值cv::Mat hash1, hash2;phash->compute( img1, hash1 );phash->compute( img2, hash2 );// 比較哈希值double distance = phash->compare( hash1, hash2 );std::cout << "漢明距離: " << distance << std::endl;return 0;
}

運行結果

漢明距離: 1

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

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

相關文章

數據庫遷移人大金倉數據庫

遷移前的準備工作 安裝官方的kdts和KStudio工具 方案說明 一、數據庫遷移&#xff1a;可以使用kdts進行數據庫的按照先遷移表結構、后數據的順序遷移&#xff08;kdts的使用可以參考官方文檔&#xff09; 其他參考文檔 人大金倉官網&#xff1a;https://download.kingbase…

uniapp 微信小程序Vue3項目使用內置組件movable-area封裝懸浮可拖拽按鈕(拖拽結束時自動吸附到最近的屏幕邊緣)

一、最終效果 二、具體詳情請看movable-area與movable-view官方文檔說明 三、參數配置 1、代碼示例 <TFab title"新建訂單" click"addOrder" /> // title:表按鈕文案 // addOrder:點擊按鈕事件四、組件源碼 <template><movable-area cl…

linux kernel為什么要用IS_ERR()宏來判斷指針合法性?

在 Linux 內核中&#xff0c;IS_ERR() 宏的設計與內核的錯誤處理機制和指針編碼規范密切相關&#xff0c;主要用于判斷一個“可能攜帶錯誤碼的指針”是否代表異常狀態。其核心目的是解決內核中指針返回值與錯誤碼的統一表示問題。以下從技術背景、設計邏輯和實際場景三個維度詳…

Cookie與Session:Web開發核心差異詳解

理解 Cookie 和 Session 的區別對于 Web 開發至關重要,它們雖然經常一起使用,但扮演著不同的角色。核心區別在于: Cookie:存儲在客戶端(用戶的瀏覽器)的數據片段。 Session:存儲在服務器端的數據結構,用于跟蹤特定用戶的狀態。 下面是詳細的對比: 特性CookieSession…

【相干、相參】 雷電名詞溯源

〇、廢話因緣 最近某些國產的微波制造公司總是提到一個概念【相干】【相參】【嚴格相參】等等概念層出不窮&#xff0c;讓人苦惱。 一、這玩意還是英文溯源吧 這幾個概念都聚焦在一個單詞【Coherence】&#xff1b;所以就是說兩個波形之間有某種聯系&#xff0c;不一定就是完全…

MYSQL練習2

一、對mydb11_stu庫進行查詢步驟1.創建mydb11_stu庫并使用2.創建score表和student表3.向兩張表插入數據student表&#xff1a;score表&#xff1a;4.完成查詢&#xff08;1&#xff09;分別查詢student表和score表的所有記錄&#xff08;2&#xff09;查詢student表的第2小到5條…

Spring Boot全局異常處理:打造堅如磐石的應用防線

引言在當今的軟件開發領域&#xff0c;隨著業務的日益復雜和系統規模的不斷擴大&#xff0c;Spring Boot 已成為 Java 開發中備受青睞的框架。它以其強大的功能、便捷的配置和快速的開發體驗&#xff0c;幫助開發者們高效地構建各種應用程序。在 Spring Boot 應用的開發過程中&…

藥品掛網價、藥品集采價格、藥品上市價格一鍵查詢!

相信許多人在查詢藥品價格時感到無從下手&#xff0c;那是因為對藥品定價機制和標準的不了解&#xff0c;醫院及藥店的藥品價格查詢可通過筆者之前的文章進行了解&#xff1a;如何查詢藥品的價格&#xff08;醫院&藥店&鄉鎮衛生院&#xff09;&#xff1f; 而今天筆者要…

【iOS】方法與消息底層分析

目錄 前言 方法的本質 向不同對象發送消息 發送實例方法 發送類方法 對象調用方法 實際執行是父類 向父類發送類方法 消息查找流程 開始查找 快速查找流程 慢速查找流程 動態方法決議 應用場景 優化方案 消息轉發機制 快速轉發流程 應用場景 慢速轉發流程 應…

如何通過 WebSocket 接口訂閱實時外匯行情數據(PHP 示例)

步驟 1&#xff1a;準備工作確保已安裝 PHP 和 Composer安裝 WebSocket 客戶端庫&#xff1a;composer require textalk/websocket步驟 2&#xff1a;編寫代碼訂閱行情以下是最簡可運行的 PHP 示例&#xff0c;訂閱 EUR/USD 的 1分鐘K線數據&#xff1a;<?phprequire vendo…

第十八篇 數據清洗:Python智能篩選與統計:從海量Excel數據中秒級挖掘,輔助決策!你的數據分析利器!

Excel 數據挖掘Excel篩選復雜&#xff0c;統計耗時&#xff0c;無法快速挖掘數據價值1.數據篩選核心&#xff1a;df.loc與df.iloc&#xff0c;精準定位你想要的數據1.1基于條件篩選&#xff1a;過濾數據中的不恰當因素1.2 多條件組合篩選&#xff1a;精確鎖定目標數據1.3字符串…

小木的機器學習日記——KNN

核心知識點總結與星級排序我為你梳理了這節課的精髓&#xff0c;并按照重要性進行了星級評定&#xff08;★★★★★為最高&#xff09;。★★★★★ 核心思想&#xff1a;回歸 (Regression) 到底是什么&#xff1f;是否關鍵&#xff1a;是必須了解&#xff1a;是必須記住&…

Product Hunt 每日熱榜 | 2025-07-15

1. OpenArt One-Click Video Story 標語&#xff1a;一鍵即可將任何內容轉換為可隨時發布的視頻。 介紹&#xff1a;有一個創意、劇本、節奏&#xff0c;或者喜歡的角色嗎&#xff1f;OpenArt可以將它們變成一個視覺故事—完整的畫面、音樂和敘事結構&#xff0c;輕松實現&am…

Dubbo高階難題:異步轉同步調用鏈上全局透傳參數的丟失問題

?問題場景?&#xff1a; 在分布式電商系統中&#xff0c;下單服務通過Dubbo調用庫存服務&#xff08;異步接口返回CompletableFuture&#xff09;&#xff0c;同時在Gateway層通過RpcContext設置traceId。你發現&#xff1a;當庫存服務內部同步調用其他服務時&#xff0c;tra…

實測兩款效率工具:駕考刷題和證件照處理的免費方案

今天阿燦給大家推薦兩款實用的軟件&#xff0c;一款是駕考助手&#xff0c;另一款是證件照制作軟件。第一款&#xff1a;駕考助手以前考駕照&#xff0c;很多人擔心過不了關&#xff0c;還會花冤枉錢買VIP練習&#xff0c;精選500題。其實&#xff0c;只要用對工具&#xff0c;…

Python 函數的維護性與復用性

目錄 一、從“能跑就行”到“能改不怕”——維護性的第一要義 二、單一職責與最小驚訝——維護性的縱深防御 三、可組合的樂高——復用性的第一階梯 四、面向協議設計——復用性的第二階梯 五、異常策略與日志——維護性的隱形護盾 七、測試金字塔——維護性的最后護城河…

C++中的模板參數 vs 函數參數:編譯期與運行期的分界線

引言 在日常開發中&#xff0c;我們經常接觸 函數參數&#xff0c;這是控制函數行為的最直接方式。但在 C 中還有一種強大的機制 —— 模板參數&#xff08;Template Parameters&#xff09;&#xff0c;它賦予了我們在編譯期就生成代碼結構的能力。 本文將通過直觀的類比&…

Elasticsearch 9.x 搜索執行過程(源碼解析)

1. Elasticsearch 9.x 搜索執行過程 - 源碼解析 #mermaid-svg-Vp6WKKBLo3omajeq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Vp6WKKBLo3omajeq .error-icon{fill:#552222;}#mermaid-svg-Vp6WKKBLo3omajeq .error…

簡單易懂,操作系統的內存管理機制是如何實現的

系統地梳理一下操作系統在“內存管理”這個重要領域中&#xff0c;到底扮演了什么角色&#xff0c;需要完成哪些核心任務。想象一下&#xff0c;操作系統是一位經驗豐富的高級公寓管理員。內存&#xff1a;就是這棟高級公寓大樓。進程&#xff1a;一個個想要入住的租戶。內存管…

《大數據技術原理與應用》實驗報告一 熟悉常用的Linux操作和Hadoop操作

目 錄 一、實驗目的 二、實驗平臺 三、 實驗內容和要求 1. 安裝虛擬機 2. 熟悉常用的 Linux 命令 3. 進行 Hadoop 偽分布式安裝 4. 熟悉常用的 Hadoop 操作 四、實驗環境 五、實驗內容與完成情況 1. 安裝虛擬機 2. 熟悉常用的 Linux 命令 3. 進行 Hadoop 偽分布式…