/* // Creation feature pyramid with nullable border // // API // featurePyramid* createFeaturePyramidWithBorder(const IplImage *image, int maxXBorder, int maxYBorder); // INPUT // image - initial image // maxXBorder - the largest root filter size (X-direction) // maxYBorder - the largest root filter size (Y-direction) // OUTPUT // RESULT // Feature pyramid with nullable border */ CvLSVMFeaturePyramid* createFeaturePyramidWithBorder(IplImage *image, int maxXBorder, int maxYBorder) { int opResult; int bx, by; int level; CvLSVMFeaturePyramid *H; // Obtaining feature pyramid opResult = getFeaturePyramid(image, LAMBDA, SIDE_LENGTH, 0, 0, image->width, image->height, &H); if (opResult != LATENT_SVM_OK) { freeFeaturePyramidObject(&H); return NULL; } /* if (opResult != LATENT_SVM_OK) */ // Addition nullable border for each feature map // the size of the border for root filters computeBorderSize(maxXBorder, maxYBorder, &bx, &by); for (level = 0; level < H->countLevel; level++) { addNullableBorder(H->pyramid[level], bx, by); } return H; }
/* // Transformation filter displacement from the block space // to the space of pixels at the initial image // // API // int convertPoints(int countLevel, CvPoint *points, int *levels, CvPoint **partsDisplacement, int kPoints, int n); // INPUT // countLevel - the number of levels in the feature pyramid // points - the set of root filter positions (in the block space) // levels - the set of levels // partsDisplacement - displacement of part filters (in the block space) // kPoints - number of root filter positions // n - number of part filters // initialImageLevel - level that contains features for initial image // maxXBorder - the largest root filter size (X-direction) // maxYBorder - the largest root filter size (Y-direction) // OUTPUT // points - the set of root filter positions (in the space of pixels) // partsDisplacement - displacement of part filters (in the space of pixels) // RESULT // Error status */ int convertPoints(int /*countLevel*/, int lambda, int initialImageLevel, CvPoint *points, int *levels, CvPoint **partsDisplacement, int kPoints, int n, int maxXBorder, int maxYBorder) { int i, j, bx, by; float step, scale; step = powf( 2.0f, 1.0f / ((float)lambda) ); computeBorderSize(maxXBorder, maxYBorder, &bx, &by); for (i = 0; i < kPoints; i++) { // scaling factor for root filter scale = SIDE_LENGTH * powf(step, (float)(levels[i] - initialImageLevel)); points[i].x = (int)((points[i].x - bx + 1) * scale); points[i].y = (int)((points[i].y - by + 1) * scale); // scaling factor for part filters scale = SIDE_LENGTH * powf(step, (float)(levels[i] - lambda - initialImageLevel)); for (j = 0; j < n; j++) { partsDisplacement[i][j].x = (int)((partsDisplacement[i][j].x - 2 * bx + 1) * scale); partsDisplacement[i][j].y = (int)((partsDisplacement[i][j].y - 2 * by + 1) * scale); } } return LATENT_SVM_OK; }
CvLSVMFeatureMap* featureMapBorderPartFilter(CvLSVMFeatureMap *map, int maxXBorder, int maxYBorder) { int bx, by; int sizeX, sizeY, i, j, k; CvLSVMFeatureMap *new_map; computeBorderSize(maxXBorder, maxYBorder, &bx, &by); sizeX = map->sizeX + 2 * bx; sizeY = map->sizeY + 2 * by; allocFeatureMapObject(&new_map, sizeX, sizeY, map->p, map->xp); for (i = 0; i < sizeX * sizeY * map->p; i++) { new_map->Map[i] = 0.0; } for (i = by; i < map->sizeY + by; i++) { for (j = bx; j < map->sizeX + bx; j++) { for (k = 0; k < map->p; k++) { new_map->Map[(i * sizeX + j) * map->p + k] = map->Map[((i - by) * map->sizeX + j - bx) * map->p + k]; } } } return new_map; }