/* Converts the 2D array of orientation histograms into a feature's descriptor vector. @param hist 2D array of orientation histograms @param d width of hist @param n bins per histogram @param feat feature into which to store descriptor */ static void hist_to_descr( double*** hist, int d, int n, struct feature* feat ) { int int_val, i, r, c, o, k = 0; //遍历d*d*n的三维直方图数组,将其中的所有数据(一般是128个)都存入feat结构的descr成员中 for( r = 0; r < d; r++ ) for( c = 0; c < d; c++ ) for( o = 0; o < n; o++ ) feat->descr[k++] = hist[r][c][o]; feat->d = k;//特征描述子的维数,一般是128 //归一化特征点的特征描述子,即将特征描述子数组中每个元素除以特征描述子的模 normalize_descr( feat ); //遍历特征描述子向量,将超过阈值SIFT_DESCR_MAG_THR的元素强行赋值为SIFT_DESCR_MAG_THR for( i = 0; i < k; i++ ) if( feat->descr[i] > SIFT_DESCR_MAG_THR ) feat->descr[i] = SIFT_DESCR_MAG_THR; //再次归一化特征描述子向量 normalize_descr( feat ); /* convert floating-point descriptor to integer valued descriptor */ //遍历特征描述子向量,每个元素乘以系数SIFT_INT_DESCR_FCTR来变为整型,并且最大值不能超过255 for( i = 0; i < k; i++ ) { int_val = SIFT_INT_DESCR_FCTR * feat->descr[i]; feat->descr[i] = MIN( 255, int_val ); } }
/* Converts the 2D array of orientation histograms into a feature's descriptor vector. @param hist 2D array of orientation histograms @param d width of hist @param n bins per histogram @param feat feature into which to store descriptor */ void hist_to_descr( double*** hist, int d, int n, struct feature* feat ) { int int_val, i, r, c, o, k = 0; for( r = 0; r < d; r++ ) for( c = 0; c < d; c++ ) for( o = 0; o < n; o++ ) feat->descr[k++] = hist[r][c][o]; feat->d = k; normalize_descr( feat ); for( i = 0; i < k; i++ ) if( feat->descr[i] > SIFT_DESCR_MAG_THR ) feat->descr[i] = SIFT_DESCR_MAG_THR; normalize_descr( feat ); /* convert floating-point descriptor to integer valued descriptor */ for( i = 0; i < k; i++ ) { int_val = SIFT_INT_DESCR_FCTR * feat->descr[i]; feat->descr[i] = MIN( 255, int_val ); } }