Ejemplo n.º 1
0
void Lu::compute(){

 int n=x3d.cols();
 
 //std::cout<<"No. points "<<n<<std::endl;

  int val= objpose(x3d.block(0,0,3,n), x2dn.block(0,0,2,n));
  
  //Estimate 3d position of the points in camera coordinates
  MatrixXf  xcam=MatrixXf::Zero(n,3); //recovered 3d positions optional
  MatrixXf x3daux=x3d.block(0,0,3,n);
  Vector3f xw;
  Xcam=MatrixXf::Zero(3,n); 
  

  
 for (int i=0; i<n;i++){
 
   xw=x3daux.col(i);

   Xcam.col(i)=K*(R*xw+t);
   
   Xcam.col(i)=Xcam.col(i)/Xcam(2,i);
   
   //std::cout<<"xcam \n"<<Xcam<<std::endl;
   
    
   }
}
Ejemplo n.º 2
0
void arGetInitRot2_sub2(real_t &err, mat33_t &R, vec3_t &t, const vec3_array &_model, const vec3_array &_iprts, const options_t _options)
{
	mat33_t Rlu_;
	vec3_t tlu_;
	unsigned int it1_;
	real_t obj_err1_;
	real_t img_err1_;

	vec3_array model(_model.begin(),_model.end());
	vec3_array iprts(_iprts.begin(),_iprts.end());
	options_t options;
	memcpy(&options,&_options,sizeof(options_t));

	mat33_clear(Rlu_);
	vec3_clear(tlu_);
	it1_ = 0;
	obj_err1_ = 0;
	img_err1_ = 0;

	objpose(R, t, it1_, obj_err1_, img_err1_, false, model, iprts, options);

	/*pose_vec sol;
	sol.clear();
	get2ndPose_Exact(sol,iprts,model,Rlu_,tlu_,0);
	int min_err_idx = (-1);
	real_t min_err = MAX_FLOAT;
	for(unsigned int i=0; i<sol.size(); i++)
	{
		mat33_copy(options.initR,sol[i].R);
		objpose(Rlu_, tlu_, it1_, obj_err1_, img_err1_, true, model, iprts, options);
		mat33_copy(sol[i].PoseLu_R,Rlu_);
		vec3_copy(sol[i].PoseLu_t,tlu_);
		sol[i].obj_err = obj_err1_;
		if(sol[i].obj_err < min_err)
		{
			min_err = sol[i].obj_err;
			min_err_idx = i;
		}
	}

	if(min_err_idx >= 0)
	{
		mat33_copy(R,sol[min_err_idx].PoseLu_R);
		vec3_copy(t,sol[min_err_idx].PoseLu_t);
		err = sol[min_err_idx].obj_err;
	}
	else
	{
		mat33_clear(R);
		vec3_clear(t);
		err = MAX_FLOAT;
	}*/
}
Ejemplo n.º 3
0
// =====================================================================================
// function returns two solutions to the pose problem (1st has the lower Error !!!!!!
// ====================================================================================
void robust_pose(real_t *err, mat33_t *R , vec3_t *t, 
		 real_t *errb, mat33_t *Rb, vec3_t *tb,
		 const vec3_t *_model, const vec3_t *_iprts, const options_t _options, const int n)
{
 
  
  
	mat33_t Rlu_;
	vec3_t tlu_;
	int it1_, i;
	real_t obj_err1_;
	real_t img_err1_;
	
	vec3_t model[n];
	vec3_t iprts[n];
	memcpy(&*model, _model, n * sizeof(vec3_t));
	memcpy(&*iprts, _iprts, n * sizeof(vec3_t));
	
	options_t options;
	memcpy(&options, &_options, sizeof(options_t));

	mat33_clear(&Rlu_);
	vec3_clear(&tlu_);
	it1_ = 0;
	obj_err1_ = 0;
	img_err1_ = 0;
	
	objpose(&Rlu_, &tlu_, &it1_, &obj_err1_, &img_err1_, CALC_IMAGE_ERROR, &*model, &*iprts, options, n);

	pose_t sol[10];
	int sol_n = 0;
	
	get2ndPose_Exact(&*sol, &*iprts, &*model, Rlu_, tlu_, 0, n, &sol_n);
	
  // refine all poses 
  for(i=0; i<sol_n; i++)
  {
    mat33_copy(&options.initR, &sol[i].R);
	
    objpose(&Rlu_, &tlu_, &it1_, &obj_err1_, &img_err1_, CALC_IMAGE_ERROR, &*model, &*iprts, options, n);
	
    mat33_copy(&sol[i].PoseLu_R, &Rlu_);
    vec3_copy(&sol[i].PoseLu_t, &tlu_);
    sol[i].obj_err = obj_err1_;
  }
  
  //  from all solutions get the best 
  int min_err_idx = (-1);
  real_t min_err = MAX_FLOAT;
  for(i=0; i<sol_n; i++)
    if(sol[i].obj_err < min_err)
    {
      min_err = sol[i].obj_err;
      min_err_idx = i;
    }
  
  // Copy the best solution !!!
	if(min_err_idx >= 0)
	{
		mat33_copy(R, &sol[min_err_idx].PoseLu_R);
		vec3_copy(t, &sol[min_err_idx].PoseLu_t);
		*err = sol[min_err_idx].obj_err;
	}
	else
	{
		mat33_clear(R);
		vec3_clear(t);
		*err = MAX_FLOAT;
	}
//  from all solutions get the 2nd Best one !!
  int min_err_idx2 = min_err_idx;
  min_err = MAX_FLOAT;
  
  for(i=0; i < sol_n; i++)
  {
    if(sol[i].obj_err < min_err  && 
       (min_err_idx2 != i) )
    {
      min_err = sol[i].obj_err;
      min_err_idx = i;
    }
  }
  // Copy the 2nd best solution !!!
  if(min_err_idx >= 0)
  {
    mat33_copy(Rb, &sol[min_err_idx].PoseLu_R);
    vec3_copy(tb, &sol[min_err_idx].PoseLu_t);
    *errb = sol[min_err_idx].obj_err;
  }
  else
  {
    mat33_clear(R);
    vec3_clear(t);
    *err = MAX_FLOAT;
  }
  
}