OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimMeanRadialLensDistortion.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 // Copyright (C) 2000 ImageLinks Inc.
3 //
4 // License: See top level LICENSE.txt file.
5 //
6 // Author: Garrett Potts
7 //
8 // Description:
9 //
10 // MeanRadialLens distortion.
11 //*******************************************************************
12 // $Id: ossimMeanRadialLensDistortion.cpp 15929 2009-11-16 18:20:46Z gpotts $
14 
15 #include <ossim/base/ossimCommon.h>
17 #include <ossim/base/ossimString.h>
18 
19 RTTI_DEF1(ossimMeanRadialLensDistortion, "ossimMeanRadialLensDistortion", ossimLensDistortion);
20 
21 void ossimMeanRadialLensDistortion::solveCoefficients(const std::vector<double>& radialDistance,
22  const std::vector<double>& radialDistortion)
23 {
24  NEWMAT::ColumnVector distanceVec((int)radialDistance.size());
25  NEWMAT::ColumnVector distortionVec((int)radialDistortion.size());
26  ossim_uint32 idx = 0;
27 
28  theCoefficients[0] = 0;
29  theCoefficients[1] = 0;
30  theCoefficients[2] = 0;
31  theCoefficients[3] = 0;
32  if(radialDistance.size() == radialDistortion.size())
33  {
34  for(idx = 0; idx < radialDistance.size();++idx)
35  {
36  distanceVec[idx] = radialDistance[idx];
37  distortionVec[idx] = radialDistortion[idx];
38  }
39  solveCoefficients(distanceVec,
40  distortionVec);
41  }
42 }
43 
44 void ossimMeanRadialLensDistortion::solveCoefficients(const NEWMAT::ColumnVector &radialDistance,
45  const NEWMAT::ColumnVector &radialDistortion)
46 {
47  NEWMAT::ColumnVector coefficients(4);
48  theCoefficients.resize(4);
49  theCoefficients[0] = 0;
50  theCoefficients[1] = 0;
51  theCoefficients[2] = 0;
52  theCoefficients[3] = 0;
53  if((radialDistance.Nrows() == 0) ||
54  (radialDistortion.Nrows() == 0))
55  {
56  return;
57  }
58  if(radialDistance.Nrows() == radialDistortion.Nrows())
59  {
60  NEWMAT::Matrix M(radialDistance.Nrows(), 4);
61 
62  // set up the matrix
63  for(long row = 0; row < M.Nrows(); row++)
64  {
65  M[row][0] = radialDistance[row];
66  M[row][1] = M[row][0]*radialDistance[row]*radialDistance[row];
67  M[row][2] = M[row][1]*radialDistance[row]*radialDistance[row];
68  M[row][3] = M[row][2]*radialDistance[row]*radialDistance[row];
69  }
70 
71  NEWMAT::Matrix mTranspose = M.t();
72  coefficients = ((mTranspose*M).i())*(mTranspose*radialDistortion);
73 
74  theCoefficients[0] = coefficients[0];
75  theCoefficients[1] = coefficients[1];
76  theCoefficients[2] = coefficients[2];
77  theCoefficients[3] = coefficients[3];
78  }
79  else
80  {
81  }
82 }
83 
84 double ossimMeanRadialLensDistortion::deltaR(double radius)const
85 {
86  double r3 = radius*radius*radius;
87  double r5 = r3*radius*radius;
88  double r7 = r5*radius*radius;
89 
90  return (radius*theCoefficients[0] +r3*theCoefficients[1] + r5*theCoefficients[2] + r7*theCoefficients[3]);
91 }
92 
93 
95 {
96  ossimDpt deltaPosition(input.x - theCenter.x,
97  input.y - theCenter.y);
98  double r = sqrt(deltaPosition.x*deltaPosition.x +
99  deltaPosition.y*deltaPosition.y);
100  double deltaRadius = deltaR(r);
101 
102  if((fabs(r) <= FLT_EPSILON)||
103  (fabs(deltaRadius) <= FLT_EPSILON))
104  {
105  output = input;
106  return;
107  }
108 
109  double deltaX = (deltaPosition.x*(deltaRadius/r));
110  double deltaY = (deltaPosition.y*(deltaRadius/r));
111 
112  output.x = deltaPosition.x-deltaX;
113  output.y = deltaPosition.y-deltaY;
114 }
115 
117  const char* prefix)const
118 {
119  kwl.add(prefix,
120  "k0",
121  theCoefficients[0],
122  true);
123 
124  kwl.add(prefix,
125  "k1",
126  theCoefficients[1],
127  true);
128  kwl.add(prefix,
129  "k2",
130  theCoefficients[2],
131  true);
132 
133  kwl.add(prefix,
134  "k3",
135  theCoefficients[3],
136  true);
137 
138  return ossimLensDistortion::saveState(kwl, prefix);
139 }
140 
142  const char* prefix)
143 {
144  const char* k0 = kwl.find(prefix, "k0");
145  const char* k1 = kwl.find(prefix, "k1");
146  const char* k2 = kwl.find(prefix, "k2");
147  const char* k3 = kwl.find(prefix, "k3");
148 
149  if(k1&&k2&&k3&&k3)
150  {
155  }
156  else
157  {
158  std::vector<double> distances;
159  std::vector<double> distortions;
160  ossim_uint32 idx = 0;
161  const char* distance = kwl.find(prefix, "distance0");
162  const char* distortion = kwl.find(prefix, "distortion0");
163 
164  while(distance&&distortion)
165  {
166  distances.push_back(ossimString(distance).toDouble());
167  distortions.push_back(ossimString(distortion).toDouble());
168  ++idx;
169  distance = kwl.find(prefix,
170  ossimString("distance")+ossimString::toString(idx));
171  distortion = kwl.find(prefix,
172  ossimString("distortion")+ossimString::toString(idx));
173  }
174 
175  solveCoefficients(distances, distortions);
176  }
177 
178  return ossimLensDistortion::loadState(kwl, prefix);
179 
180 }
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Represents serializable keyword/value map.
const char * find(const char *key) const
double y
Definition: ossimDpt.h:165
static ossimString toString(bool aValue)
Numeric to string methods.
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
void solveCoefficients(const NEWMAT::ColumnVector &radialDistance, const NEWMAT::ColumnVector &radialDistortion)
#define FLT_EPSILON
unsigned int ossim_uint32
double toDouble() const
virtual void undistort(const ossimDpt &input, ossimDpt &output) const
RTTI_DEF1(ossimMeanRadialLensDistortion, "ossimMeanRadialLensDistortion", ossimLensDistortion)
double x
Definition: ossimDpt.h:164
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
float distance(double lat1, double lon1, double lat2, double lon2, int units)