使用Insight库进行感知哈希

Perceptual hashing using Insight library

本文关键字:感知 哈希 Insight 使用      更新时间:2023-10-16

对于我正在进行的项目,我想使用Insight感知哈希库。在阅读了一篇有趣的博客文章之后(http://bertolami.com/index.php?engine=blog&content=帖子&detail=感知哈希)我试着让它为自己工作,但我在C++中处理图像文件的经验很少。

到目前为止我拥有的代码:

#include "stdafx.h"
#include "vnInsight.h"
#include <string>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
CVImage ** A, ** B; // Declare image objects
UINT32 statusA = vnCreateImage(VN_IMAGE_FORMAT_R8G8B8, 960, 960, A); // Does not actually initialise A?
UINT32 statusB = vnCreateImage(VN_IMAGE_FORMAT_R8G8B8, 960, 960, B);
UINT8 * addressA = (*A)->QueryData(); // Documentation says I have to retrieve an address with this function
vnCompareImages(** A, ** B); // 'A not initialised error'
return 0;
}

上面的混乱是通过使用库遵循文档而产生的,库足够小,我可以将其复制/粘贴到这里:

Insight的主要接口是CompareImages函数:

FLOAT32vnCompareImages(CONST CVImage&pA、CONST CVImage&pB);此函数将返回一个区间为[0,1]的值指示两个输入图像之间的相似性的百分比。

CVImage对象是格式化内存缓冲区的简单包装器。若要创建新图像,请调用vnCreateImage(),传入维度并且期望的图像格式(当前只有VN_image_format_R8G8B8Insight支持)。

一旦这个调用完成,图像对象就被分配并准备好填充您的图像数据。您可以通过复制来提供此数据到CVImage::QueryData()指示的地址。别忘了打电话vnDestroyImage()。

我的问题是;如何进行简单的图像相似性检查?此外,CVImage对象究竟是什么?("格式化内存缓冲区的简单包装"对我来说并不完全清楚)

我曾将Insight用于一个大学项目,并取得了相当不错的结果。您的代码很接近,但需要在以下几个方面进行修复:

CVImage *A, *B; // Declare image object pointers
vnCreateImage(VN_IMAGE_FORMAT_R8G8B8, 960, 960, &A); // allocate space for image A
vnCreateImage(VN_IMAGE_FORMAT_R8G8B8, 960, 960, &B); // allocate space for image B

此时,A和B各自指向已分配但未初始化的图像。

接下来,您需要用有效的图像数据填充A和B(否则,您将只是比较两个黑色图像)。在我的项目中,我从位图文件中加载数据,并将其复制到图像中。

正确填写图像后,调用vnCompareImages获取结果。

FLOAT32 fPercentageMatch = vnCompareImages(*A, *B);

不要忘记在完成图像后解除分配:

vnDestroyImage(A);
vnDestroyImage(B);