/* Trains the classifier on warps of a bounding-box patch. frame: frame to take warps from bb: first-frame bounding-box [x, y, width, height] */ void bbWarpPatch(IntegralImage *frame, double *bb) { // Transformation matrix float *m = new float[4]; // Loop through various rotations and skews for (float r = -0.1f; r < 0.1f; r += 0.005f) { float sine = sin(r); float cosine = cos(r); for (float sx = -0.1f; sx < 0.1f; sx += 0.05f) { for (float sy = -0.1f; sy < 0.1f; sy += 0.05f) { // Set transformation /* Rotation matrix * skew matrix = | cos r sin r | * | 1 sx | = | -sin r cos r | | sy 1 | | cos r + sy * sin r sx * cos r + sin r | | sy * cos r - sin r cos r - sx * sin r | */ m[0] = cosine + sy * sine; m[1] = sx * cosine + sine; m[2] = sy * cosine - sine; m[3] = cosine - sx * sine; // Create warp and train classifier IntegralImage *warp = new IntegralImage(); warp->createWarp(frame, bb, m); classifier->train(warp, 0, 0, (int)bb[2], (int)bb[3], 1); delete warp; } } } delete m; }
// 用边框盒围住的小块的仿射变换来训练分类器 // frame: 输入的用于仿射变换的图像 // bb: 第一帧中的边框盒[x,y,width,height] void bbWarpPatch(IntegralImage *frame, double *bb) { // 变换矩阵 float *m = new float[4]; // 循环穿过各种旋转和斜交参数 for (float r = -0.1f; r < 0.1f; r += 0.005f) { float sine = sin(r); float cosine = cos(r); for (float sx = -0.1f; sx < 0.1f; sx += 0.05f) { for (float sy = -0.1f; sy < 0.1f; sy += 0.05f) { // 设置转换矩阵 /* Rotation matrix * skew matrix = | cos r sin r | * | 1 sx | = | -sin r cos r | | sy 1 | | cos r + sy * sin r sx * cos r + sin r | | sy * cos r - sin r cos r - sx * sin r | */ m[0] = cosine + sy * sine; m[1] = sx * cosine + sine; m[2] = sy * cosine - sine; m[3] = cosine - sx * sine; // 创建仿射变换,然后训练分类器 IntegralImage *warp = new IntegralImage(); warp->createWarp(frame, bb, m); classifier->train(warp, 1, 1, (int)bb[2], (int)bb[3], 1); delete warp; } } } delete m; }