ITPub博客

首页 > IT职业 > IT生活 > 基于 Sift + Kmeans + 倒排索引 的图像匹配

基于 Sift + Kmeans + 倒排索引 的图像匹配

IT生活 作者:ricky0621 时间:2021-09-09 09:15:27 0 删除 编辑

点击打开链接

具体配置问度娘,此处略过!

三: 部分代码实现


1.  提取sift特征向量

struct feature* featTemp;
featTemp->feat_num = sift_features( img, &featTemp );
export_features(fileName,featTemp,featTemp->feat_num);


2.  Kmeans聚类

	CvMat *samples=cvCreateMat(featNum, 128, CV_32FC1); //包含所有图片的所有feature信息的矩阵,featureNum个feature,每个feature为dims(128)维向量,每一维的元素类型为32位浮点数
	CvMat *clusters=cvCreateMat(featNum, 1, CV_32SC1); //每个feature所在“质心”的指针(实际上本例程中没有用到该信息)
	//CvMat *centers=cvCreateMat(cluster_count, 128, CV_32FC1); //“质心”信息的数组,k个“质心”每个质心都是dims(128)维向量,每一维的元素类型为32位浮点数
	
	cvSet(clusters,cvScalar(1,0,0,0),0);
	cvSet(centers,cvScalar(1,0,0,0),0);

	//获取sift特征文件列表
	getFilePathArray("*.feature");
	if (fileListHead == NULL)
	{
		printf("please makeLib first");
		return 0;
	}
	filelist = fileListHead;

	do
	{
		n = import_features(filelist->name, FEATURE_LOWE, &featTemp); //导入feature文件,n为导入的
		for(i = 0; i data.fl[temp++] = featTemp[i].descr[j];
			}
		}

	}while( filelist->next != NULL && (filelist = filelist->next) );

	cvKMeans2(samples, cluster_count, clusters,cvTermCriteria(CV_TERMCRIT_EPS,10,1.0) ); //Kmeans聚类


3.  建立倒排索引表

//最大图片数量 超出则需要修改数组大小
#define  MAX_LIB_PIC 500
//聚类目标类种
#define MAX_MEANS 1024
//创建feature字典,并保存到文件中
//feature[]:数组中存储每一个文件的特征个数
int createKeyWordList(CvMat *samples,CvMat *clusters,const char* filename,int feature[],int featureNum)
{
	int loop = 0, loop2 = 0,whichFile = 0,key;
	int keyWordList[MAX_LIB_PIC][MAX_MEANS] = {0} ;
	int dictionary[MAX_MEANS][MAX_LIB_PIC] = {0};
	
	int ave[MAX_MEANS] = {0};
	int avePic[MAX_LIB_PIC] = {0};
	FILE* fp,*word;
	fp = fopen( filename ,  "w" );
	if ( fp == NULL )
	{
		printf("createKeyWordList file writr error ");
	}

//求出每一个文件feature的词频
	for ( loop = 0 ; loop = feature[whichFile] )
		{
			whichFile ++;
		}

		keyWordList[whichFile][ clusters->data.i[loop] ]++;
	}
// 将词频转化为百分率占比
	for ( loop2 = 0 ; loop2 
//建立倒排索引
	for ( loop = 0 ; loop 

4.  查询图像特征

float macheImageFeat[MAX_MEANS] = {0};
int MakeMatch(const char* filename , struct kd_node* kd_root)
{
	struct feature *match , *copy;
	struct feature** nbrs;
	int k , i , count = 0,num;
	double d0, d1;
	match = (struct feature*)malloc(sizeof(struct feature));
	_getcwd(feature_Path,_MAX_PATH);

	num = import_features(filename,FEATURE_LOWE,&match);
	memset(macheImageFeat,0, MAX_MEANS * sizeof(float) );
	for( i = 0; i 


5.  求出最佳匹配图片

int getMaxMatch( float lable[] , int dictionary[MAX_MEANS][MAX_LIB_PIC]){

	int loop,loop2,result,num = 1,temp;
	int target[3] = {0};
	float ret[MAX_LIB_PIC] = {0} ;

	for ( loop2 = 0 ; loop2 macheImageFeat
		}
	}

	result = 0;
	for ( loop2 = 0 ; loop2 


大功告成。


目前对学校建筑物图片就行测试,图片库大概20张左右,准确率为100%。

原文出处

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3829/viewspace-2809076/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-27

  • 博文量
    0
  • 访问量
    1076