/* Adds features to an array for every orientation in a histogram greater than a specified threshold. @param features new features are added to the end of this array @param hist orientation histogram @param n number of bins in hist @param mag_thr new features are added for entries in hist greater than this @param feat new features are clones of this with different orientations */ static void add_good_ori_features( CvSeq* features, double* hist, int n, double mag_thr, struct feature* feat ) { struct feature* new_feat; double bin, PI2 = CV_PI * 2.0; int l, r, i; //遍历直方图 for( i = 0; i < n; i++ ) { l = ( i == 0 )? n - 1 : i-1;//前一个(左边的)bin的下标 r = ( i + 1 ) % n;//后一个(右边的)bin的下标 //若当前的bin是局部极值(比前一个和后一个bin都大),并且值大于给定的幅值阈值,则新生成一个特征点并添加到特征点序列末尾 if( hist[i] > hist[l] && hist[i] > hist[r] && hist[i] >= mag_thr ) { //根据左、中、右三个bin的值对当前bin进行直方图插值 bin = i + interp_hist_peak( hist[l], hist[i], hist[r] ); bin = ( bin < 0 )? n + bin : ( bin >= n )? bin - n : bin;//将插值结果规范到[0,n]内 new_feat = clone_feature( feat );//克隆当前特征点为新特征点 new_feat->ori = ( ( PI2 * bin ) / n ) - CV_PI;//新特征点的方向 cvSeqPush( features, new_feat );//插入到特征点序列末尾 free( new_feat ); } } }
/* Adds features to an array for every orientation in a histogram greater than a specified threshold. @param features new features are added to the end of this array @param hist orientation histogram @param n number of bins in hist @param mag_thr new features are added for entries in hist greater than this @param feat new features are clones of this with different orientations */ void add_good_ori_features( CvSeq* features, double* hist, int n, double mag_thr, struct feature* feat ) { struct feature* new_feat; double bin, PI2 = CV_PI * 2.0; int l, r, i; for( i = 0; i < n; i++ ) { l = ( i == 0 )? n - 1 : i-1; r = ( i + 1 ) % n; if( hist[i] > hist[l] && hist[i] > hist[r] && hist[i] >= mag_thr ) { bin = i + interp_hist_peak( hist[l], hist[i], hist[r] ); bin = ( bin < 0 )? n + bin : ( bin >= n )? bin - n : bin; new_feat = clone_feature( feat ); new_feat->ori = ( ( PI2 * bin ) / n ) - CV_PI; cvSeqPush( features, new_feat ); free( new_feat ); } } }