//Creates offsets that can be added to bounding boxes //offsets are contained in the form delta11, delta12,... (combined index of dw and dh) //Order: scale.tree->feature void EnsembleClassifier::initFeatureOffsets() { featureOffsets= new int[numScales*numTrees*numFeatures*2]; int *off = featureOffsets; for (int k = 0; k < numScales; k++){ Size scale = scales[k]; for (int i = 0; i < numTrees; i++) { for (int j = 0; j < numFeatures; j++) { float *currentFeature = features + (4*numFeatures)*i +4*j; *off++ = sub2idx((scale.width-1)*currentFeature[0]+1,(scale.height-1)*currentFeature[1]+1,imgWidthStep); //We add +1 because the index of the bounding box points to x-1, y-1 *off++ = sub2idx((scale.width-1)*currentFeature[2]+1,(scale.height-1)*currentFeature[3]+1,imgWidthStep); } } } }
//Creates offsets that can be added to bounding boxes //offsets are contained in the form delta11, delta12,... (combined index of dw and dh) //Order: scale->tree->feature void DetectorCascade::initWindowOffsets() { windowOffsets = new int[TLD_WINDOW_OFFSET_SIZE * numWindows]; int *off = windowOffsets; int windowSize = TLD_WINDOW_SIZE; for(int i = 0; i < numWindows; i++) { int *window = windows + windowSize * i; *off++ = sub2idx(window[0] - 1, window[1] - 1, imgWidthStep); // x1-1,y1-1 *off++ = sub2idx(window[0] - 1, window[1] + window[3] - 1, imgWidthStep); // x1-1,y2 *off++ = sub2idx(window[0] + window[2] - 1, window[1] - 1, imgWidthStep); // x2,y1-1 *off++ = sub2idx(window[0] + window[2] - 1, window[1] + window[3] - 1, imgWidthStep); // x2,y2 *off++ = window[4] * 2 * numFeatures * numTrees; // pointer to features for this scale *off++ = window[2] * window[3]; //Area of bounding box } }