局部敏感哈希(原始LSH)C++实现

    之前项目中用到LSH算法来做特征检索,对LSH算法很好奇,最近看了LSH的论文,依照自己的理解,初步写了LSH代码。测试效果不是特别理想,参数的选择也基本靠尝试,姑且先把代码放上来,之后再改进吧(2016.01.24)

代码块

#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
/* 算法思路
  1. 确定参数 k(bitCount)、以及哈希表个数l; (这里设置固定值吧 不知道怎么求最优质)
  2. 生成一级哈希函数;
  3. 数据一级哈希到bucket
  4. 压缩bucket.用二级哈希函数把一级的bucket哈希到二级哈希表中(需要确定二级哈希表的容量M);
  */
const int k = 700; //或者用展开成01串的特征的长度来计算k 
const int l = 10;
const int MaxValue = 255;//特征为uchar类型
const int M = 100; //二级哈希表的容量


struct Bucket
{
vector<Mat> features;//保存hash到这个桶的图像的特征
vector<int> names;//保存图像的名称
int bucketSize;
};
struct Table 
{
vector<Bucket> bucket;
int TableSize;
};
class myLSH
{
public:
myLSH(){};
~myLSH(){};
public:
int Init( int m, int l, float ratio,int featureDims );
int train(Mat featurtes);
int Search(Mat feature,int& name, int& dist);//输入查询特征 返回特征名 和距离
private:
//int creatHashFamily(); 
int GetHashFun_level1();//生成一级哈希函数
int Hash_level1( Mat feature,int hashFunID,vector<unsigned char>& value );//输入一级哈希函数、原始特征,得到原始特征的映射value;这里用的算法避免了把数字展开成01串
int Hash_level2( vector<unsigned 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
the code from net,share with you: 获取图像库里所有图片文件的名称 Blue hills.jpg Lena.jpg myhand1.jpg myhand2.jpg Sunset.jpg Test2.jpg Test3.JPG Water lilies.jpg Winter.jpg 获取图像特征 0 36 82 115 132 164 200 142 129 119 54 1 198 141 101 64 43 65 124 200 197 186 2 104 40 25 34 81 88 56 108 131 199 3 142 56 43 61 117 121 107 160 120 200 4 46 67 80 104 200 193 90 66 59 43 5 121 110 141 149 200 195 171 144 123 116 6 99 125 116 88 68 82 99 141 200 104 7 200 178 175 151 154 183 156 159 164 177 8 131 161 192 199 181 182 186 174 147 129 获取随机点位 将整数转换为01 特征值MD5压缩处理 1 733c7ccfc61b08a62633fc2356b90478 2 bdc6c147ad15bcf1bd91e343ec15d4f8 3 70a0d1a5d191e0bd3ceb65003ce4e386 4 1d8d003fe0d417eb1d3413773e58f4de 5 b04a5fd1301bf66c192a23e155236dd5 6 0d7afe69ff25e61710e7f63d5a7779ca 7 0b534a69d1eb5edfd7fef486b9270fc7 8 373b04655e21dee1372e374916a7774f 9 68b400bf74bc815844f58e19ead1ceb7 1 733c7ccfc61b08a62633fc2356b90478 2 bdc6c147ad15bcf1bd91e343ec15d4f8 3 70a0d1a5d191e0bd3ceb65003ce4e386 4 1d8d003fe0d417eb1d3413773e58f4de 5 b04a5fd1301bf66c192a23e155236dd5 6 0d7afe69ff25e61710e7f63d5a7779ca 7 0b534a69d1eb5edfd7fef486b9270fc7 8 373b04655e21dee1372e374916a7774f 9 68b400bf74bc815844f58e19ead1ceb7 1 733c7ccfc61b08a62633fc2356b90478 2 bdc6c147ad15bcf1bd91e343ec15d4f8 3 70a0d1a5d191e0bd3ceb65003ce4e386 4 1d8d003fe0d417eb1d3413773e58f4de 5 b04a5fd1301bf66c192a23e155236dd5 6 0d7afe69ff25e61710e7f63d5a7779ca 7 0b534a69d1eb5edfd7fef486b9270fc7 8 373b04655e21dee1372e374916a7774f 9 68b400bf74bc815844f58e19ead1ceb7 1 733c7ccfc61b08a62633fc2356b90478 2 bdc6c147ad15bcf1bd91e343ec15d4f8 3 70a0d1a5d191e0bd3ceb65003ce4e386 4 1d8d003fe0d417eb1d3413773e58f4de 5 b04a5fd1301bf66c192a23e155236dd5 6 0d7afe69ff25e61710e7f63d5a7779ca 7 0b534a69d1eb5edfd7fef486b9270fc7 8 373b04655e21dee1372e374916a7774f 9 68b400bf74bc815844f58e19ead1ceb7 1 733c7ccfc61b08a62633fc2356b90478 2 bdc6c147ad15bcf1bd91e343ec15d4f8 3 70a0d1a5d191e0bd3ceb65003ce4e386 4 1d8d003fe0d417eb1d3413773e58f4de 5 b04a5fd1301bf66c192a23e155236dd5 6 0d7afe69ff25e61710e7

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值