OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimSensorModelTuple.cpp
Go to the documentation of this file.
1 //----------------------------------------------------------------------------
2 //
3 // License: See top level LICENSE.txt file.
4 //
5 // Author: David Hicks
6 //
7 // Description: Base class for tuple-based ossimSensorModel metric operations.
8 //
9 //----------------------------------------------------------------------------
10 // $Id: ossimSensorModelTuple.cpp 22045 2012-12-28 21:22:35Z dhicks $
11 
15 #include <ossim/base/ossimCommon.h>
16 #include <ossim/base/ossimDatum.h>
20 #include <ossim/base/ossimTrace.h>
21 #include <ossim/base/ossimString.h>
22 #include <ossim/base/ossimNotify.h>
24 
25 static ossimTrace traceDebug(ossimString("ossimSensorModelTuple:debug"));
26 static ossimTrace traceExec(ossimString("ossimSensorModelTuple:exec"));
27 
28 #ifdef OSSIM_ID_ENABLED
29 static const char OSSIM_ID[] = "$Id: ossimSensorModelTuple.cpp 22045 2012-12-28 21:22:35Z dhicks $";
30 #endif
31 
33 : theRpcElevationAngle(ossim::nan()),
34  theRpcAzimuthAngle(ossim::nan()),
35  theRpcBiasError(ossim::nan()),
36  theRpcRandError(ossim::nan()),
37  theSurfaceNormalVector(),
38  theSurfaceCovMatrix(3,3)
39 {
40 }
41 
43 {
44 }
45 
46 //*****************************************************************************
47 // METHOD: ossimSensorModelTuple::ossimSensorModelTuple()
48 //
49 // Constructor.
50 //
51 //*****************************************************************************
53 :
54  theNumImages(0),
55  theSurfCE90(0.0),
56  theSurfLE90(0.0),
57  theSurfAccSet(false),
58  theSurfAccRepresentsNoDEM(false),
59  theRpcPqeInputs()
60 {
61  if (traceDebug())
62  {
64  << "\nossimSensorModelTuple::ossimSensorModelTuple DEBUG:"
65  << std::endl;
66 #ifdef OSSIM_ID_ENABLED
68  << "OSSIM_ID: " << OSSIM_ID << std::endl;
69 #endif
70  }
71 
72 }
73 
74 
75 //*****************************************************************************
76 // DESTRUCTOR: ~ossimSensorModelTuple()
77 //
78 //*****************************************************************************
80 {
81  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG)
82  << "DEBUG: ~ossimSensorModelTuple(): entering..." << std::endl;
83  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG)
84  << "DEBUG: ~ossimSensorModelTuple(): returning..." << std::endl;
85 }
86 
87 
88 //*****************************************************************************
89 // METHOD: ossimSensorModelTuple::addImage()
90 //
91 // Add an image to the tuple.
92 //
93 //*****************************************************************************
95 {
96  theImages.push_back(image);
97  theNumImages++;
98 }
99 
100 
101 //*****************************************************************************
102 // METHOD: ossimSensorModelTuple::setIntersectionSurfaceAccuracy()
103 //
104 // Allow calling program to set the DEM accuracy.
105 //
106 // If both values are negative, it is assumed that no DEM is used.
107 //
108 //*****************************************************************************
111  const ossim_float64& surfLE90)
112 {
113  bool setOK = false;
114 
115  if (surfCE90>=0.0 && surfLE90>=0.0)
116  {
117  theSurfCE90 = surfCE90;
118  theSurfLE90 = surfLE90;
119  theSurfAccSet = true;
121  setOK = true;
122  }
123  else
124  {
125  //***************************************************************
126  // RPC_No_DEM_State Demo case
127  // In this case, surfCE90/surfLE90 are interpreted differently:
128  // [1] surfCE90 contains the scale divisor for RPC hgtScale
129  // [2] surfLE90 contains the probability level divisor for
130  // RPC hgtScale to yield a 1-sigma value
131  // These coputations are performed in computeSingleInterCov.
132  //***************************************************************
133  theSurfCE90 = surfCE90;
134  theSurfLE90 = surfLE90;
135  theSurfAccSet = false;
137  setOK = true;
138  }
139 
140  return setOK;
141 }
142 
143 
144 
146 {
147  obj = theRpcPqeInputs;
148 }
149 
150 //*****************************************************************************
151 // METHOD: ossimSensorModelTuple::print()
152 //
153 // Print info.
154 //
155 //*****************************************************************************
157 {
158  out << "\n ossimSensorModelTuple::print:" << std::endl;
159  for (int i=0; i<theNumImages; ++i)
160  theImages[i]->print(out);
161 
162  return out;
163 }
164 
165 
166 //*****************************************************************************
167 // METHOD: ossimSensorModelTuple::intersect()
168 //
169 // Perform multi-image intersection.
170 //
171 //*****************************************************************************
173 intersect(const DptSet_t obs,
174  ossimEcefPoint& pt,
175  NEWMAT::Matrix& covMat) const
176 {
177  IntersectStatus opOK = OP_FAIL;
178  bool covOK = true;
179  bool epOK;
180  ossim_int32 nImages = (ossim_int32)obs.size();
181 
182  if (nImages > 1)
183  {
184 
185  // Matrices
186  NEWMAT::SymmetricMatrix N(3);
187  NEWMAT::SymmetricMatrix BtWB(3);
188  NEWMAT::Matrix Ni(3,3);
189  NEWMAT::ColumnVector C(3);
190  NEWMAT::ColumnVector BtWF(3);
191  NEWMAT::ColumnVector F(2);
192  NEWMAT::ColumnVector dR(3);
193  NEWMAT::Matrix B(2,3);
194  NEWMAT::SymmetricMatrix W(2);
195 
196  // Get a priori ground estimate using first point
197  ossimGpt estG;
198  theImages[0]->lineSampleToWorld(obs[0], estG);
199 
200  for (int iter=0; iter<5; iter++)
201  {
202  // cout<<"\n iter: "<<iter;
203 
204  N = 0.0;
205  C = 0.0;
206 
207  // Loop over observations
208  for (int i=0; i<nImages; i++)
209  {
210  ossimDpt resid;
211  if (!getGroundObsEqComponents(i, obs[i], estG, resid, B, W))
212  {
213  covOK = false;
214  }
215 
216  F[0] = resid.x;
217  F[1] = resid.y;
218  // cout<<"\n F{"<<i+1<<"}: "<<F[0]<<", "<<F[1];
219 
220  // Form coefficient matrix & discrepancy vector
221  BtWF << B.t() * W * F;
222  BtWB << B.t() * W * B;
223  C += BtWF;
224  N += BtWB;
225  }
226 
227  // Solve system
228  Ni = invert(N);
229  dR = Ni * C;
230 
231  // cout<<"\n dR: ("<<dR[0]<<", "<<dR[1]<<", "<<dR[2]<<")"<<endl;
232 
233  // Update estimate
234  double latUpd = estG.latd() - dR[0];
235  double lonUpd = estG.lond() - dR[1];
236  double hgtUpd = estG.height() - dR[2];
237 
238  estG.latd(latUpd);
239  estG.lond(lonUpd);
240  estG.height(hgtUpd);
241 
242  if (traceDebug())
243  {
245  << "DEBUG: intersect:\n"
246  << " iteration:\n" << iter
247  // << " C:\n" << C
248  // << " Ni:\n" << Ni
249  << " dR:\n" << dR <<std::endl;
250  }
251 
252  } // iterative loop
253 
254  // Return intersected point
255  ossimEcefPoint finalEst(estG);
256  pt = finalEst;
257 
258  // Return propagated covariance matrix
259  if (covOK)
260  {
261  covMat = Ni;
262  epOK = true;
263  }
264  else
265  epOK = false;
266 
267  // Set operation status
268  if (epOK)
269  opOK = OP_SUCCESS;
270  else
271  opOK = ERROR_PROP_FAIL;
272  }
273 
274  return opOK;
275 }
276 
277 
278 //*****************************************************************************
279 // METHOD: ossimSensorModelTuple::intersect()
280 //
281 // Perform single-image intersection at specified height.
282 //
283 //*****************************************************************************
286  const ossimDpt& obs,
287  const ossim_float64& atHeightAboveEllipsoid,
288  ossimEcefPoint& pt,
289  NEWMAT::Matrix& covMat)
290 {
291  IntersectStatus opOK = OP_FAIL;
292  ossimGpt ptG;
293 
294  // Intersection
295  theImages[img]->lineSampleHeightToWorld(obs, atHeightAboveEllipsoid, ptG);
296  ossimEcefPoint ptECF(ptG);
297  pt = ptECF;
298 
299  // Error propagation
300  bool epOK = computeSingleInterCov(img, obs, ptG, AT_HGT, covMat);
301 
302  // Set operation status
303  if (epOK)
304  opOK = OP_SUCCESS;
305  else
306  opOK = ERROR_PROP_FAIL;
307 
308  return opOK;
309 }
310 
311 
312 //*****************************************************************************
313 // METHOD: ossimSensorModelTuple::intersect()
314 //
315 // Perform single-image intersection at DEM.
316 //
317 //*****************************************************************************
320  const ossimDpt& obs,
321  ossimEcefPoint& pt,
322  NEWMAT::Matrix& covMat)
323 {
324  IntersectStatus opOK = OP_FAIL;
325  ossimGpt ptG;
326 
327  // Intersection
328  theImages[img]->lineSampleToWorld(obs, ptG);
329  ossimEcefPoint ptECF(ptG);
330  pt = ptECF;
331 
332  // Error propagation
333  bool epOK = computeSingleInterCov(img, obs, ptG, AT_DEM, covMat);
334 
335  // Set operation status
336  if (epOK)
337  opOK = OP_SUCCESS;
338  else
339  opOK = ERROR_PROP_FAIL;
340 
341  return opOK;
342 }
343 
344 
345 //*****************************************************************************
346 // METHOD: ossimSensorModelTuple::getGroundObsEqComponents()
347 //
348 // Extract residuals, partials and weight matrix for observation.
349 //
350 //*****************************************************************************
352  const ossim_int32 img,
353  const ossimDpt& obs,
354  const ossimGpt& ptEst,
355  ossimDpt& resid,
356  NEWMAT::Matrix& B,
357  NEWMAT::SymmetricMatrix& W) const
358 {
359  // Temporary image geometry
360  ossimImageGeometry* iGeom = new ossimImageGeometry(NULL, (ossimProjection*) theImages[img].get());
361 
362  // Evaluate residuals
363  ossimDpt computedImg;
364  iGeom->worldToLocal(ptEst, computedImg);
365  resid = obs - computedImg;
366 
367  // Evaluate partials B(2X3)
368  NEWMAT::Matrix Bt(3,2);
369  iGeom->computeGroundToImagePartials(Bt, ptEst);
370  B = Bt.t();
371 
372  // Get covariance matrix & form weight matrix
373  NEWMAT::SymmetricMatrix Cov(2);
375  covStatus = theImages[img]->getObsCovMat(obs,Cov);
376 
377  if (covStatus == ossimSensorModel::COV_INVALID)
378  {
379  W = 0.0;
380  W(1,1) = 1.0;
381  W(2,2) = 1.0;
382  }
383  else
384  {
385  NEWMAT::Matrix Wfull = invert(Cov);
386  W << Wfull;
387  }
388 
389  bool covOK = false;
390  if (covStatus == ossimSensorModel::COV_FULL)
391  covOK = true;
392 
393  return covOK;
394 }
395 
396 
397 //*****************************************************************************
398 // METHOD: ossimSensorModelTuple::computeSingleInterCov()
399 //
400 // Compute single image intersection covariance matrix.
401 //
402 //*****************************************************************************
404  const ossim_int32& img,
405  const ossimDpt& obs,
406  const ossimGpt& ptG,
407  HeightRefType_t cRefType,
408  NEWMAT::Matrix& covMat)
409 {
410  NEWMAT::SymmetricMatrix BtWB(3);
411  NEWMAT::Matrix B(2,3);
412  NEWMAT::SymmetricMatrix W(2);
413  NEWMAT::Matrix surfCovENU(3,3);
414  ossimDpt resid;
415 
416  bool tCovOK;
417  bool covOK;
418 
419  // Set the height reference
420  ossimHgtRef hgtRef(cRefType);
421 
422 
423  if (PTR_CAST(ossimRpcModel, theImages[img]))
424  {
426 
427  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
428  // Special case for handling RPC LOS error components
429  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
430  ossimGpt ptObs(obs.samp,obs.line);
431  theImages[img]->getForwardDeriv(OBS_INIT, ptObs);
432  resid = theImages[img]->getForwardDeriv(EVALUATE, ptG);
433  ossimDpt pWRTx = theImages[img]->getForwardDeriv(P_WRT_X, ptG);
434  ossimDpt pWRTy = theImages[img]->getForwardDeriv(P_WRT_Y, ptG);
435  ossimDpt pWRTz = theImages[img]->getForwardDeriv(P_WRT_Z, ptG);
436 
437  // Form required partials in local frame
438  ossimLsrSpace enu(ptG);
439  NEWMAT::Matrix jECF(3,2);
440  jECF(1,1) = pWRTx.u;
441  jECF(1,2) = pWRTx.v;
442  jECF(2,1) = pWRTy.u;
443  jECF(2,2) = pWRTy.v;
444  jECF(3,1) = pWRTz.u;
445  jECF(3,2) = pWRTz.v;
446  NEWMAT::Matrix jLSR(3,2);
447  jLSR = enu.ecefToLsrRotMatrix()*jECF;
448  ossim_float64 dU_dx = jLSR(1,1);
449  ossim_float64 dU_dy = jLSR(2,1);
450  ossim_float64 dU_dz = jLSR(3,1);
451  ossim_float64 dV_dx = jLSR(1,2);
452  ossim_float64 dV_dy = jLSR(2,2);
453  ossim_float64 dV_dz = jLSR(3,2);
454 
455  // Compute azimuth & elevation angles
456  ossim_float64 den = dU_dy*dV_dx - dV_dy*dU_dx;
457  ossim_float64 dY = dU_dx*dV_dz - dV_dx*dU_dz;
458  ossim_float64 dX = dV_dy*dU_dz - dU_dy*dV_dz;
459  ossim_float64 dy_dH = dY / den;
460  ossim_float64 dx_dH = dX / den;
461  ossim_float64 tAz = atan2(dx_dH, dy_dH);
462  ossim_float64 tEl = atan2(1.0, sqrt(dy_dH*dy_dH+dx_dH*dx_dH));
463 
464 
465  // Get the terrain surface info required by ossimPositionQualityEvaluator
466  ossimColumnVector3d surfN = hgtRef.getLocalTerrainNormal(ptG);
467  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
468  // Currently, the CE/LE must be explicitly set by the
469  // setIntersectionSurfaceAccuracy. When DEM accuracy maintenance
470  // is fully supported, the following call should be used.
471  // bool tCovOK = hgtRef.getHeightCovMatrix(ptG, covECF);
472  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
473  ossim_float64 surfCE;
474  ossim_float64 surfLE;
475 
477  {
478  //***************************************************************
479  // RPC_No_DEM_State Demo case
480  // In this case, surfCE90/surfLE90 are interpreted differently:
481  // [1] surfCE90 contains the scale divisor for RPC hgtScale
482  // [2] surfLE90 contains the probability level divisor for
483  // RPC hgtScale to yield a 1-sigma value
484  //***************************************************************
485 
486  // Reset the surface normal to vertical
487  surfN = surfN.zAligned();
488 
489  // Set approximate surface CE/LE based on RPC parameters
490  // [1] Assume range (scale) only to be 90% vertical error for now
491  // [2] Assume bias could be used for height
493  model->getRpcParameters(rpcPar);
494  ossim_float64 hgtRng = rpcPar.hgtScale;
495  surfCE = 0.0;
496  ossim_float64 scaledHgtRng = abs(hgtRng/theSurfCE90);
497  ossim_float64 scaled1SigmaHgtRng = abs(scaledHgtRng/theSurfLE90);
498  surfLE = scaled1SigmaHgtRng*1.6449;
499 
500  if(traceDebug())
501  {
503  << "\n computeSingleInterCov() RPC NoDEM state selected..."
504  << "\n RPC Height Scale = " << rpcPar.hgtScale <<" m"
505  << "\n Scale Divisor = " <<abs(theSurfCE90)
506  << "\n 1-Sigma Divisor = "<<abs(theSurfLE90)
507  << std::endl;
508  }
509  }
510  else
511  {
512  surfCE = theSurfCE90;
513  surfLE = theSurfLE90;
514  }
515 
516  tCovOK = hgtRef.getSurfaceCovMatrix(surfCE, surfLE, surfCovENU);
517 
518  // Evaluate & retrieve the ENU covariance matrix
519  if (tCovOK)
520  {
521  // Store for later retrieval...
528 
529  if(traceDebug())
530  {
532  << "\n RPC error prop parameters..."
533  << "\n Elevation Angle = " << tEl*DEG_PER_RAD<< " deg"
534  << "\n Azimuth Angle = " << tAz*DEG_PER_RAD<<" deg"
535  << "\n RPC Bias Error = " <<model->getBiasError() <<" m"
536  << "\n RPC Random Error = " <<model->getRandError()<<" m"
537  << "\n surfN = " <<surfN
538  << "\n surfCovENU = \n" <<surfCovENU
539  << std::endl;
540  }
541 
542  ossimEcefPoint pt(ptG);
543 
545  (pt,model->getBiasError(),model->getRandError(),
546  tEl,tAz,surfN,surfCovENU);
547  NEWMAT::Matrix covENU(3,3);
548  covOK = qev.getCovMatrix(covENU);
549 
550  // Transform to ECF for output
551  if (covOK)
552  {
553  covMat = enu.lsrToEcefRotMatrix()*covENU*enu.ecefToLsrRotMatrix();
554  }
555  }
556  else
557  {
558  covOK = false;
559  }
560  }
561 
562  else
563  {
564  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
565  // Standard covariance matrix formation
566  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
567  // Image contribution
568  covOK = getGroundObsEqComponents(img, obs, ptG, resid, B, W);
569  BtWB << B.t() * W * B;
570 
571  // Height contribution
572  NEWMAT::Matrix St(3,3);
573  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
574  // Currently, the CE/LE must be explicitly set by the
575  // setIntersectionSurfaceAccuracy. When DEM accuracy maintenance
576  // is fully supported, the following call should be used.
577  // hgtRef.getHeightCovMatrix(ptG, St);
578  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
579 
580  // Check for special case of "no DEM" error propagation, only used for RPC
582  {
583  if(traceDebug())
584  {
586  << "\n computeSingleInterCov() RPC NoDEM state selected..."
587  << " Not valid for this sensor model" << std::endl;
588  }
589  }
590 
591  if (hgtRef.getSurfaceCovMatrix(theSurfCE90, theSurfLE90, surfCovENU))
592  {
593  tCovOK = hgtRef.getSurfaceNormalCovMatrix(ptG, surfCovENU, St);
594  }
595  else
596  {
597  tCovOK = false;
598  }
599 
600  if (tCovOK)
601  {
602  NEWMAT::Matrix Sti = invert(St);
603  // Full ECF covariance matrix
604  covMat = invert(BtWB + Sti);
605  }
606  else
607  {
608  // Don't include height
609  covMat = invert(BtWB);
610  }
611  }
612 
613  return covOK;
614 }
615 
616 
617 //*****************************************************************************
618 // METHOD: ossimSensorModelTuple::invert()
619 //
620 // Perform SVD matrix inversion.
621 //
622 //*****************************************************************************
623 NEWMAT::Matrix ossimSensorModelTuple::invert(const NEWMAT::Matrix& m) const
624 {
625  ossim_uint32 idx = 0;
626  NEWMAT::DiagonalMatrix d;
627  NEWMAT::Matrix u;
628  NEWMAT::Matrix v;
629 
630  // decompose m.t*m into the singular values and vectors.
631  NEWMAT::SVD(m, d, u, v, true, true);
632 
633  // invert the diagonal
634  for(idx=0; idx < (ossim_uint32)d.Ncols(); ++idx)
635  {
636  if(d[idx] > 1e-14) //TBC : use DBL_EPSILON ?
637  {
638  d[idx] = 1.0/d[idx];
639  }
640  else
641  {
642  d[idx] = 0.0;
643  if (traceDebug())
644  {
646  << "DEBUG: ossimSensorModelTuple::invert(): "
647  << "\nsingular matrix in SVD..."
648  << std::endl;
649  }
650  }
651  }
652 
653  //compute inverse of decomposed m;
654  return v*d*u.t();
655 }
ossimSensorModelTuple()
default constructor
std::ostream & print(std::ostream &out) const
print method.
void getRpcPqeInputs(ossimRpcPqeInputs &obj) const
NEWMAT::Matrix theSurfaceCovMatrix
double lond() const
Will convert the radian measure to degrees.
Definition: ossimGpt.h:97
#define DEG_PER_RAD
ossim_float64 theRpcAzimuthAngle
double u
Definition: ossimDpt.h:164
double samp
Definition: ossimDpt.h:164
double nan()
Method to return ieee floating point double precision NAN.
Definition: ossimCommon.h:135
This code was derived from https://gist.github.com/mshockwave.
Definition: Barrier.h:8
bool computeGroundToImagePartials(NEWMAT::Matrix &result, const ossimGpt &gpt, const ossimDpt3d &deltaLlh)
double y
Definition: ossimDpt.h:165
ossim_float64 theRpcRandError
ossim_float64 theRpcBiasError
vector< ossimDpt > DptSet_t
#define abs(a)
Definition: auxiliary.h:74
void getRpcParameters(ossimRpcModel::rpcModelStruct &model) const
Returns RPC parameter set in structure.
double latd() const
Will convert the radian measure to degrees.
Definition: ossimGpt.h:87
bool computeSingleInterCov(const ossim_int32 &img, const ossimDpt &obs, const ossimGpt &ptG, HeightRefType_t cRefType, NEWMAT::Matrix &covMat)
Compute single image intersection covariance matrix.
virtual bool getSurfaceCovMatrix(const ossimGpt &pg, NEWMAT::Matrix &cov) const
Method to get surface information string.
ossimSensorModelTuple::IntersectStatus intersect(const DptSet_t obs, ossimEcefPoint &pt, NEWMAT::Matrix &covMat) const
Multi-image intersection method.
ossim_float64 theRpcElevationAngle
double ossim_float64
const NEWMAT::Matrix & lsrToEcefRotMatrix() const
double line
Definition: ossimDpt.h:165
std::vector< ossimRefPtr< ossimSensorModel > > theImages
Container class to hold computed rpc model inputs to the ossimPositionQualityEvaluator constructor...
~ossimSensorModelTuple()
virtual destructor
unsigned int ossim_uint32
double height() const
Definition: ossimGpt.h:107
#define PTR_CAST(T, p)
Definition: ossimRtti.h:321
void SVD(const Matrix &, DiagonalMatrix &, Matrix &, Matrix &, bool=true, bool=true)
Definition: svd.cpp:26
RPC model structure used for access function.
Definition: ossimRpcModel.h:44
Container class that holds both 2D transform and 3D projection information for an image Only one inst...
bool setIntersectionSurfaceAccuracy(const ossim_float64 &surfCE90, const ossim_float64 &surfLE90)
Set intersection surface accuracy method.
NEWMAT::Matrix ecefToLsrRotMatrix() const
virtual ossimColumnVector3d getLocalTerrainNormal(const ossimGpt &pg) const
Method to get local terrain normal unit vector (slope).
NEWMAT::Matrix invert(const NEWMAT::Matrix &m) const
double getRandError() const
Returns Error - Random.
double getBiasError() const
Returns Error - Bias.
double x
Definition: ossimDpt.h:164
bool worldToLocal(const ossimGpt &world_pt, ossimDpt &local_pt) const
Exposes the 3D world-to-local image coordinate reverse projection.
void addImage(ossimSensorModel *image)
Method to add an image to the tuple.
bool getGroundObsEqComponents(const ossim_int32 img, const ossimDpt &obs, const ossimGpt &ptEst, ossimDpt &resid, NEWMAT::Matrix &B, NEWMAT::SymmetricMatrix &W) const
Get observation equation components.
ossimColumnVector3d theSurfaceNormalVector
bool getSurfaceNormalCovMatrix(const ossimGpt &pg, const NEWMAT::Matrix &surfCov, NEWMAT::Matrix &normCov) const
Method to get surface normal covariance matrix.
const ossimColumnVector3d & zAligned()
HeightRefType_t
Definition: ossimHgtRef.h:17
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23
double v
Definition: ossimDpt.h:165
int ossim_int32
ossimRpcPqeInputs theRpcPqeInputs
Rpc model only, container to capture pqe inputs for report purposes only.