Exemple #1
0
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;
}
Exemple #2
0
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();
}
Exemple #3
0
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();
}
Exemple #4
0
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;		
	}
}
Exemple #5
0
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;
	}
}