使用Insight库进行感知哈希
Perceptual hashing using Insight library
对于我正在进行的项目,我想使用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);
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- boost::包含提升单元的元组的哈希值
- 使用 Key 对 C++ 中的哈希映射进行排序. 无法排序
- C++中的并发哈希表
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 如何为位集找到/实现一个好的哈希函数
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 使用Insight库进行感知哈希