GaussianBlur(frame, img, Size(9,9), 1.5);
warped = img(bbhull);
RNG& rng = theRNG();
Point2f pt(bbhull.x + (bbhull.width-1)*0.5f, bbhull.y+(bbhull.height-1)*0.5f);
vector<int> fern(classifier.getNumStructs());
pX.clear();
Mat patch;
if (pX.capacity() < num_warps * good_boxes.size())
pX.reserve(num_warps * good_boxes.size());
int idx;
for (int i=0; i< num_warps; i++){
if (i>0)
generator(frame, pt, warped, bbhull.size(), rng);
for (int b=0; b < good_boxes.size(); b++){
idx = good_boxes[b];
patch = img(grid[idx]);
classifier.getFeatures(patch, grid[idx].sidx, fern);
pX.push_back(make_pair(fern, 1));
}
}
printf("Positive examples generated: ferns:%d NN:1\n",(int)pX.size());
}
void TLD::getPattern(const Mat& img, Mat& pattern, Scalar& mean, Scalar& stdev){
resize(img, pattern, Size(patch_size, patch_size));
meanStdDev(pattern, mean, stdev);
pattern.convertTo(pattern, CV_32F);
pattern = pattern - mean.val[0];
}
void TLD::generateNegativeData(const Mat& frame){
random_shuffle(bad_boxes.begin(), bad_boxes.end());
int idx;
int a=0;
printf("negative data generation started.\n");
vector<int> fern(classifier.getNumStructs());
nX.reserve(bad_boxes.size());
Mat patch;
for (int j=0;j<bad_boxes.size();j++){
idx = bad_boxes[j];
if (getVar(grid[idx],iisum,iisqsum)<var*0.5f)
continue;
patch = frame(grid[idx]);
classifier.getFeatures(patch, grid[idx].sidx, fern);
nX.push_back(make_pair(fern, 0));
a++;
}
printf("Negative examples generated: ferns: %d ", a);
Scalar dum1, dum2;
nEx=vector<Mat>(bad_patches);
for (int i=0;i<bad_patches;i++){
idx=bad_boxes[i];
patch = frame(grid[idx]);
getPattern(patch,nEx[i],dum1,dum2);
}
printf("NN: %d\n",(int)nEx.size());
}
double TLD::getVar(const BoundingBox& box, const Mat& sum, const Mat& sqsum){
double brs = sum.at<int>(box.y+box.height, box.x+box.width);
double bls = sum.at<int>(box.y+box.height, box.x);
double trs = sum.at<int>(box.y,box.x + box.width);
double tls = sum.at<int>(box.y,box.x);
double brsq = sqsum.at<double>(box.y+box.height,box.x+box.width);
double blsq = sqsum.at<double>(box.y+box.height,box.x);
double trsq = sqsum.at<