具体配置问度娘,此处略过!
三: 部分代码实现
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/ ,如需转载,请注明出处,否则将追究法律责任。