Warp MT::Lucas_Kanade(Warp warp) { for (int iter = 0; iter < max_iteration; ++iter) { Matx61f G; Matx<float, 6, 6> H; G = 0.0f; H = 0.0f; float E = 0.0f; for (int i = 0; i < fine_samples.size(); ++i) { Matx<float, L4, 1> T(fine_model.ptr<float>(i)), F; Matx<float, 2, L4> dF; Matx<float, 2, 6> dW = warp.gradient(fine_samples[i]); Point2f p = warp.transform2(fine_samples[i]); feature.gradient4(p.x, p.y, F.val, dF.val, dF.val + L4); T -= F; float e = sigmoid(T.dot(T)); E += e; float w = sigmoid_factor * e * (1.0f - e); G += w * (dW.t() * (dF * T)); H += w * (dW.t() * (dF * dF.t()) * dW); } E = E / fine_samples.size(); Matx61f D; solve(H, G, D, DECOMP_SVD); warp.steepest(D); if (iter > 1 && D(3) * D(3) + D(4) * D(4) + D(5) * D(5) < translate_eps) { if (log != NULL) (*log) << "\terror in iteration " << iter << " = " << E << endl; break; } } return warp; }
float MT::evaluate(Warp warp) { rect_t rect = window(warp.t); float fine_cell = sqrt(rectArea(rect) / cell_n); feature.set_cell(fine_cell); feature.set_step(1); float E = 0.0f; for (int i = 0; i < fine_samples.size(); ++i) { Vector2f p = warp.transform2(fine_samples[i]); Vector32f F; feature.descriptor4(p.x(), p.y(), F.data()); E = E + sigmoid((F - fine_model.col(i)).squaredNorm()); } return E / fine_samples.size(); }
float MT::evaluate(Warp warp) { Rect2f rect = window(warp.t); float fine_cell = sqrt(rect.area() / cell_n); feature.set_cell(fine_cell); feature.set_step(1); float E = 0.0f; for (int i = 0; i < fine_samples.size(); ++i) { Matx<float, L4, 1> T(fine_model.ptr<float>(i)), I; Point2f p = warp.transform2(fine_samples[i]); feature.descriptor4(p.x, p.y, I.val); T -= I; E = E + sigmoid(T.dot(T)); } return E / fine_samples.size(); }
void MT::fine_train(Warp warp) { Rect2f rect = window(warp.t); float fine_cell = sqrt(rect.area() / cell_n); feature.set_cell(fine_cell); feature.set_step(1); Mat model(fine_samples.size(), L4, CV_32FC1); for (int i = 0; i < fine_samples.size(); ++i) { Point2f p = warp.transform2(fine_samples[i]); feature.descriptor4(p.x, p.y, model.ptr<float>(i)); } if (fine_model.empty()) { N = 1; fine_model = model; } else { ++N; fine_model = (float(N - 1) / N) * fine_model + (1.0f / N) * model; } }
void MT::fine_train(Warp warp) { rect_t rect = window(warp.t); float fine_cell = sqrt(rectArea(rect) / cell_n); feature.set_cell(fine_cell); feature.set_step(1); //compute the features on the grid MatrixXf model(32, fine_samples.size()); for (int i = 0; i < fine_samples.size(); ++i) { Vector2f p = warp.transform2(fine_samples[i]); feature.descriptor4(p.x(), p.y(), model.col(i).data()); } //update using a moving averaging manner if (N == 0) { N = 1; fine_model = model; } else { ++N; fine_model = (float(N - 1) / N) * fine_model + (1.0f / N) * model; } }