⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sba_levmar_wrap.c

📁 sparse bundle ajustment的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
      (*proj)(j, rcsubs[i], paj, pxij, proj_adata); // evaluate Q in pxij    }  }}/* Given a parameter vector p made up of the parameters of m cameras, compute in jac * the jacobian of the predicted measurements, i.e. the jacobian of the projections of 3D points in the m images. * The jacobian is returned in the order (A_11, ..., A_1m, ..., A_n1, ..., A_nm), * where A_ij=dx_ij/db_j (see HZ). * Caller supplies rcidxs and rcsubs which can be used as working memory. * Notice that depending on idxij, some of the A_ij might be missing * */static void sba_mot_Qs_jac(double *p, struct sba_crsm *idxij, int *rcidxs, int *rcsubs, double *jac, void *adata){  register int i, j;  int cnp, mnp;  double *paj, *pAij;  //int n;  int m, nnz, Asz, idx;  struct wrap_mot_data_ *wdata;  void (*projac)(int j, int i, double *aj, double *Aij, void *projac_adata);  void *projac_adata;  wdata=(struct wrap_mot_data_ *)adata;  cnp=wdata->cnp; mnp=wdata->mnp;  projac=wdata->projac;  projac_adata=wdata->adata;  //n=idxij->nr;  m=idxij->nc;  Asz=mnp*cnp;  for(j=0; j<m; ++j){    /* j-th camera parameters */    paj=p+j*cnp;    nnz=sba_crsm_col_elmidxs(idxij, j, rcidxs, rcsubs); /* find nonzero hx_ij, i=0...n-1 */    for(i=0; i<nnz; ++i){      idx=idxij->val[rcidxs[i]];      pAij=jac + idx*Asz; // set pAij to point to A_ij      (*projac)(j, rcsubs[i], paj, pAij, projac_adata); // evaluate dQ/da in pAij    }  }}/* Given a parameter vector p made up of the parameters of m cameras, compute in jac the jacobian * of the predicted measurements, i.e. the jacobian of the projections of 3D points in the m images. * The jacobian is approximated with the aid of finite differences and is returned in the order * (A_11, ..., A_1m, ..., A_n1, ..., A_nm), where A_ij=dx_ij/da_j (see HZ). * Notice that depending on idxij, some of the A_ij might be missing * * Problem-specific information is assumed to be stored in a structure pointed to by "dat". * * NOTE: This function is provided mainly for illustration purposes; in case that execution time is a concern, * the jacobian should be computed analytically */static void sba_mot_Qs_fdjac(    double *p,                /* I: current parameter estimate, (m*cnp)x1 */    struct sba_crsm *idxij,   /* I: sparse matrix containing the location of x_ij in hx */    int    *rcidxs,           /* work array for the indexes of nonzero elements of a single sparse matrix row/column */    int    *rcsubs,           /* work array for the subscripts of nonzero elements in a single sparse matrix row/column */    double *jac,              /* O: array for storing the approximated jacobian */    void   *dat)              /* I: points to a "wrap_mot_data_" structure */{  register int i, j, ii, jj;  double *paj;  register double *pA;  //int n;   int m, nnz, Asz;  double tmp;  register double d, d1;  struct wrap_mot_data_ *fdjd;  void (*proj)(int j, int i, double *aj, double *xij, void *adata);  double *hxij, *hxxij;  int cnp, mnp;  void *adata;  /* retrieve problem-specific information passed in *dat */  fdjd=(struct wrap_mot_data_ *)dat;  proj=fdjd->proj;  cnp=fdjd->cnp; mnp=fdjd->mnp;  adata=fdjd->adata;  //n=idxij->nr;  m=idxij->nc;  Asz=mnp*cnp;  /* allocate memory for hxij, hxxij */  if((hxij=malloc(2*mnp*sizeof(double)))==NULL){    fprintf(stderr, "memory allocation request failed in sba_mot_Qs_fdjac()!\n");    exit(1);  }  hxxij=hxij+mnp;  /* compute A_ij */  for(j=0; j<m; ++j){    paj=p+j*cnp; // j-th camera parameters    nnz=sba_crsm_col_elmidxs(idxij, j, rcidxs, rcsubs); /* find nonzero A_ij, i=0...n-1 */    for(jj=0; jj<cnp; ++jj){      /* determine d=max(SBA_DELTA_SCALE*|paj[jj]|, SBA_MIN_DELTA), see HZ */      d=(double)(SBA_DELTA_SCALE)*paj[jj]; // force evaluation      d=FABS(d);      if(d<SBA_MIN_DELTA) d=SBA_MIN_DELTA;      d1=1.0/d; /* invert so that divisions can be carried out faster as multiplications */      for(i=0; i<nnz; ++i){        (*proj)(j, rcsubs[i], paj, hxij, adata); // evaluate supplied function on current solution        tmp=paj[jj];        paj[jj]+=d;        (*proj)(j, rcsubs[i], paj, hxxij, adata);        paj[jj]=tmp; /* restore */        pA=jac + idxij->val[rcidxs[i]]*Asz; // set pA to point to A_ij        for(ii=0; ii<mnp; ++ii)          pA[ii*cnp+jj]=(hxxij[ii]-hxij[ii])*d1;      }    }  }  free(hxij);}/* BUNDLE ADJUSTMENT FOR STRUCTURE PARAMETERS ONLY *//* Given a parameter vector p made up of the 3D coordinates of n points, compute in * hx the prediction of the measurements, i.e. the projections of 3D points in the m images. The measurements * are returned in the order (hx_11^T, .. hx_1m^T, ..., hx_n1^T, .. hx_nm^T)^T, where hx_ij is the predicted * projection of the i-th point on the j-th camera. * Caller supplies rcidxs and rcsubs which can be used as working memory. * Notice that depending on idxij, some of the hx_ij might be missing * */static void sba_str_Qs(double *p, struct sba_crsm *idxij, int *rcidxs, int *rcsubs, double *hx, void *adata){  register int i, j;  int pnp, mnp;   double *pbi, *pxij;  //int n;  int m, nnz;  struct wrap_str_data_ *wdata;  void (*proj)(int j, int i, double *bi, double *xij, void *proj_adata);  void *proj_adata;  wdata=(struct wrap_str_data_ *)adata;  pnp=wdata->pnp; mnp=wdata->mnp;  proj=wdata->proj;  proj_adata=wdata->adata;  //n=idxij->nr;  m=idxij->nc;  for(j=0; j<m; ++j){    nnz=sba_crsm_col_elmidxs(idxij, j, rcidxs, rcsubs); /* find nonzero hx_ij, i=0...n-1 */    for(i=0; i<nnz; ++i){      pbi=p + rcsubs[i]*pnp;      pxij=hx + idxij->val[rcidxs[i]]*mnp; // set pxij to point to hx_ij      (*proj)(j, rcsubs[i], pbi, pxij, proj_adata); // evaluate Q in pxij    }  }}/* Given a parameter vector p made up of the 3D coordinates of n points, compute in * jac the jacobian of the predicted measurements, i.e. the jacobian of the projections of 3D points in the m images. * The jacobian is returned in the order (B_11, ..., B_1m, ..., B_n1, ..., B_nm), where B_ij=dx_ij/db_i (see HZ). * Caller supplies rcidxs and rcsubs which can be used as working memory. * Notice that depending on idxij, some of the B_ij might be missing * */static void sba_str_Qs_jac(double *p, struct sba_crsm *idxij, int *rcidxs, int *rcsubs, double *jac, void *adata){  register int i, j;  int pnp, mnp;  double *pbi, *pBij;  //int n;  int m, nnz, Bsz, idx;  struct wrap_str_data_ *wdata;  void (*projac)(int j, int i, double *bi, double *Bij, void *projac_adata);  void *projac_adata;    wdata=(struct wrap_str_data_ *)adata;  pnp=wdata->pnp; mnp=wdata->mnp;  projac=wdata->projac;  projac_adata=wdata->adata;  //n=idxij->nr;  m=idxij->nc;  Bsz=mnp*pnp;  for(j=0; j<m; ++j){    nnz=sba_crsm_col_elmidxs(idxij, j, rcidxs, rcsubs); /* find nonzero hx_ij, i=0...n-1 */    for(i=0; i<nnz; ++i){      pbi=p + rcsubs[i]*pnp;      idx=idxij->val[rcidxs[i]];      pBij=jac + idx*Bsz; // set pBij to point to B_ij      (*projac)(j, rcsubs[i], pbi, pBij, projac_adata); // evaluate dQ/db in pBij    }  }}/* Given a parameter vector p made up of the 3D coordinates of n points, compute in * jac the jacobian of the predicted measurements, i.e. the jacobian of the projections of 3D points in the m images. * The jacobian is approximated with the aid of finite differences and is returned in the order * (B_11, ..., B_1m, ..., B_n1, ..., B_nm), where B_ij=dx_ij/db_i (see HZ). * Notice that depending on idxij, some of the B_ij might be missing * * Problem-specific information is assumed to be stored in a structure pointed to by "dat". * * NOTE: This function is provided mainly for illustration purposes; in case that execution time is a concern, * the jacobian should be computed analytically */static void sba_str_Qs_fdjac(    double *p,                /* I: current parameter estimate, (n*pnp)x1 */    struct sba_crsm *idxij,   /* I: sparse matrix containing the location of x_ij in hx */    int    *rcidxs,           /* work array for the indexes of nonzero elements of a single sparse matrix row/column */    int    *rcsubs,           /* work array for the subscripts of nonzero elements in a single sparse matrix row/column */    double *jac,              /* O: array for storing the approximated jacobian */    void   *dat)              /* I: points to a "wrap_str_data_" structure */{  register int i, j, ii, jj;  double *pbi;  register double *pB;  //int m;  int n, nnz, Bsz;  double tmp;  register double d, d1;  struct wrap_str_data_ *fdjd;  void (*proj)(int j, int i, double *bi, double *xij, void *adata);  double *hxij, *hxxij;  int pnp, mnp;  void *adata;  /* retrieve problem-specific information passed in *dat */  fdjd=(struct wrap_str_data_ *)dat;  proj=fdjd->proj;  pnp=fdjd->pnp; mnp=fdjd->mnp;  adata=fdjd->adata;  n=idxij->nr;  //m=idxij->nc;  Bsz=mnp*pnp;  /* allocate memory for hxij, hxxij */  if((hxij=malloc(2*mnp*sizeof(double)))==NULL){    fprintf(stderr, "memory allocation request failed in sba_str_Qs_fdjac()!\n");    exit(1);  }  hxxij=hxij+mnp;  /* compute B_ij */  for(i=0; i<n; ++i){    pbi=p+i*pnp; // i-th point parameters    nnz=sba_crsm_row_elmidxs(idxij, i, rcidxs, rcsubs); /* find nonzero B_ij, j=0...m-1 */    for(jj=0; jj<pnp; ++jj){      /* determine d=max(SBA_DELTA_SCALE*|pbi[jj]|, SBA_MIN_DELTA), see HZ */      d=(double)(SBA_DELTA_SCALE)*pbi[jj]; // force evaluation      d=FABS(d);      if(d<SBA_MIN_DELTA) d=SBA_MIN_DELTA;      d1=1.0/d; /* invert so that divisions can be carried out faster as multiplications */      for(j=0; j<nnz; ++j){        (*proj)(rcsubs[j], i, pbi, hxij, adata); // evaluate supplied function on current solution        tmp=pbi[jj];        pbi[jj]+=d;        (*proj)(rcsubs[j], i, pbi, hxxij, adata);        pbi[jj]=tmp; /* restore */        pB=jac + idxij->val[rcidxs[j]]*Bsz; // set pB to point to B_ij        for(ii=0; ii<mnp; ++ii)          pB[ii*pnp+jj]=(hxxij[ii]-hxij[ii])*d1;      }    }  }  free(hxij);}/*  * Simple driver to sba_motstr_levmar_x for bundle adjustment on camera and structure parameters.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -