Ejemplo n.º 1
0
int Lu::objpose(MatrixXf P, MatrixXf Qp)
{
  int n = P.cols();
  int i;
 // move the origin to the center of P
// std::cout<<"P\n"<<P<<std::endl; 
  
  Vector3f pbar=Vector3f::Zero();
 // std::cout<<"pbar\n"<<pbar<<std::endl;
    
  for (i = 0; i<n;i++){
 // std::cout<<"Pcol\n"<<P.col(i)<<std::endl; 
      pbar=pbar+P.col(i);
   }
 //std::cout<<"pbar\n"<<pbar; 
  pbar= pbar/n;
  
 // std::cout<<"move the origin to the center of P"<<std::endl;
 //std::cout<<"P\n"<<P;
 //std::cout<<"pbar\n"<<pbar<<std::endl; 
  
  for (i = 0; i<n;i++){
     P.col(i) = P.col(i)-pbar;
  }
 
 //std::cout<<"P\n"<<P<<std::endl; 
  MatrixXf Q;

  Q=MatrixXf::Zero(3,n);
  
for (i = 0 ;i<n;i++){

  Q(0,i)=Qp(0,i);
    Q(1,i)=Qp(1,i);
      Q(2,i)=1;
}

//std::cout<<"Q\n"<<Q<<std::endl; 
//create matrix F with 0's
//Matrix3f maux;

//for (i=0;i<n;i++ ){
//  F.push_back(Matrix3f::Zero(3,3));
//}

 
RowVector3f V;
V= RowVector3f::Zero();
std::vector<Matrix3f > F;
Matrix3f F_aux;
 
 for (i = 0 ;i<n;i++){
    V[0] = Q(0,i)/Q(2,i);
    V[1] = Q(1,i)/Q(2,i);
    V[2] = Q(2,i)/Q(2,i);
   //std::cout<<"V\n"<<V<<std::endl; 
   
   Matrix3f F_aux;
   F_aux=(V.transpose()*V)/V.dot(V);
   
   //std::cout<<"F_aux\n"<<F_aux<<std::endl; 
 //  F_aux = (V*V.transpose())/(V.transpose()*V);
   F.push_back(F_aux);
}

 //compute the matrix factor required to compute t  
 Matrix3f F_sum=Matrix3f::Zero(3,3);
 
  for (i = 0 ;i< n;i++){
    F_sum=F_sum + F[i];
  }
    
  //std::cout<<"F_sum\n"<<F_sum<<std::endl;
  
  Matrix3f tFactor = (Matrix3f::Identity()-F_sum/n);
  tFactor=tFactor.inverse()/n;
  
 //std::cout<<"tfactor\n"<<tFactor<<std::endl;
  
  MatrixXf Ri_;
  MatrixXf ti_;
  MatrixXf Qi_;
  double old_err;
  
   // compute initial pose estimate
  abskernel(P, Q, F, tFactor);
  //Lu::abskernel(MatrixXf P, MatrixXf Q, std::vector<Matrix3f > F, MatrixXf G)
   
   
  Ri_=GetRi();
  ti_=Getti();
  Qi_=GetQout();
   int it = 1;
     
  old_err=Geterr();

  
  /*std::cout<<"Ri_\n"<<Ri_<<std::endl;
  std::cout<<"ti_\n"<<ti_<<std::endl;
  std::cout<<"Qi_\n"<<Qi_<<std::endl;
 std::cout<<"old_err\n"<<old_err<<std::endl;*/
  
   //std::cout<<"old_err\n"<<old_err<<std::endl;

// compute next pose estimate
   abskernel(P, Qi_, F, tFactor);
   Ri_=GetRi();
   ti_=Getti();
   Qi_=GetQout();
   
   double new_err=Geterr();

   it = it + 1; 
   
   /*std::cout<<"Ri_2\n"<<Ri_<<std::endl;
  std::cout<<"ti_2\n"<<ti_<<std::endl;
  std::cout<<"Qi_2\n"<<Qi_<<std::endl;
 std::cout<<"new_err\n"<<new_err<<std::endl;*/
  //std::cout<<"new_err\n"<<new_err<<std::endl;
 
  double val=(old_err-new_err)/old_err;
    val=sqrt(val*val);
  /* std::cout<<"val\n"<<val<<std::endl;
   std::cout<<"TOL\n"<<TOL<<std::endl;
   std::cout<<"EPSILON\n"<<EPSILON<<std::endl;
   std::cout<<"MAX_ITER\n"<<MAX_ITER<<std::endl;*/
   while ((val > TOL) && (new_err > EPSILON)  && (it<MAX_ITER)){

    old_err = new_err;
   //std::cout<<"old_err\n"<<old_err<<std::endl;
    // compute the optimal estimate of R
    abskernel(P, Qi_, F, tFactor);
    Ri_=GetRi();
    ti_=Getti();
    Qi_=GetQout();
    new_err=Geterr();
    it = it + 1;
  }
   
   
   R = Ri;
   t = ti_;
   obj_err = sqrt(new_err/n);
   
  //double img_err = sqrt(img_err/n);
   t = t - Ri*pbar;

  
   return 0;

}
Ejemplo n.º 2
0
void objpose(mat33_t *R, vec3_t *t, int *it, real_t *obj_err, real_t *img_err,
			 bool calc_img_err, const vec3_t *_P, const vec3_t *Qp, const options_t options, const int n)
{
	int i, j;
	//vec3_array P(_P.begin(),_P.end());
	vec3_t P[n];
	memcpy(&*P, _P, n*sizeof(vec3_t));

	//const int n = (unsigned int) P.size();
	vec3_t pbar;
	vec3_array_sum(&pbar, &*P, n);
	vec3_div(&pbar, (real_t)(n));
	vec3_array_sub(&*P, &pbar, n);
	
	//vec3_array Q(Qp.begin(),Qp.end());
	vec3_t Q[n];
	memcpy(&*Q, Qp, n*sizeof(vec3_t));
	
	vec3_t ones;
	ones.v[0] = 1;
	ones.v[1] = 1;
	ones.v[2] = 1;
	const bool mask_z[3] = {0,0,1};
	vec3_array_set(&*Q, &ones, mask_z, n);
	
	//mat33_array F;
	//F.resize(n);
	mat33_t F[n];
	
	vec3_t V;
	for(i=0; i<n; i++)
	{
		V.v[0] = Q[i].v[0] / Q[i].v[2];
		V.v[1] = Q[i].v[1] / Q[i].v[2];
		V.v[2] = 1.0;
		mat33_t _m;
		vec3_mul_vec3trans(&_m, &V, &V);
		mat33_div(&_m, vec3trans_mul_vec3(&V,&V));
		F[i] = _m;
	}

	mat33_t tFactor;
	
	mat33_t _m1,_m2,_m3;
	mat33_eye(&_m1);
	mat33_array_sum(&_m2, &*F, n);
	mat33_div(&_m2, (real_t)(n));
	mat33_sub_mat2(&_m3, &_m1, &_m2);
	mat33_inv(&tFactor, &_m3);
	mat33_div(&tFactor, (real_t)(n));

	*it = 0;
	int initR_approximate = mat33_all_zeros(&options.initR);
	mat33_t Ri;
	vec3_t ti;
	
	//vec3_array Qi;
	//Qi.resize(n);
	vec3_t Qi[n];
	
	real_t old_err = 0.0, new_err = 0.0;

	// ----------------------------------------------------------------------------------------
	if(initR_approximate == 0)
	{
		mat33_copy(&Ri, &options.initR);
		vec3_t _sum;
		vec3_t _v1, _v2;
		mat33_t _m1,_m2;
		vec3_clear(&_sum);
		for(j=0; j<n; j++)
		{
			mat33_eye(&_m1);
			mat33_sub_mat2(&_m2, &F[j], &_m1);
			vec3_mult_mat(&_v1, &Ri, &P[j]);
			vec3_mult_mat(&_v2, &_m2, &_v1);
			vec3_add_vec(&_sum, &_v2);
		}
		vec3_mult_mat(&ti,&tFactor,&_sum);
		xform(&*Qi, &*P, &Ri, &ti, n);
		old_err = 0;
		vec3_t _v;
		for(j=0; j<n; j++)
		{
			mat33_eye(&_m1);
			mat33_sub_mat2(&_m2, &F[j], &_m1);
			vec3_mult_mat(&_v, &_m2, &Qi[j]);
			old_err += vec3_dot(&_v, &_v);
		}
	// ----------------------------------------------------------------------------------------
	}
	else
	{
		abskernel(&Ri, &ti, &*Qi, &old_err, &*P, &*Q, &*F, &tFactor, n);
		*it = 1;
	}
	// ----------------------------------------------------------------------------------------

	abskernel(&Ri, &ti, &*Qi, &new_err, &*P, &*Qi, &*F, &tFactor, n);
	*it = *it + 1;

	while((_abs((old_err-new_err)/old_err) > options.tol) && (new_err > options.epsilon) &&
		  (options.max_iter == 0 || *it < options.max_iter))
	{
		old_err = new_err;
		abskernel(&Ri, &ti, &*Qi, &new_err, &*P, &*Qi, &*F, &tFactor, n);
		*it = *it + 1;
	}


	mat33_copy(R, &Ri);
	vec3_copy(t, &ti);
	*obj_err = _sqrt(new_err/(real_t)(n));

	if(calc_img_err == 1)
	{
		//vec3_array Qproj;
		//Qproj.resize(n);
		vec3_t Qproj[n];
		
		xformproj(&*Qproj, &*P, &Ri, &ti, n);
		*img_err = 0;

		vec3_t _v;
		for(j=0; j<n; j++)
		{
			vec3_sub_vec2(&_v, &Qproj[j], &Qp[j]);
			*img_err += vec3_dot(&_v, &_v);
		}
		*img_err = _sqrt(*img_err/(real_t)(n));
	}

	if(t->v[2] < 0)
	{
		mat33_mult(R, -1.0);
		vec3_mult(t, -1.0);
	}

	vec3_t _ts;
	vec3_mult_mat(&_ts, &Ri, &pbar);
	vec3_sub_vec(t, &_ts);
}