OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimPpjFrameSensorFile.cpp
Go to the documentation of this file.
3 #include <fstream>
6 
8 :m_radialDistortion(2),
9 m_tangentialDistortion(2),
10 m_averageProjectedHeight(0.0)
11 {
12  reset();
13 }
14 
16 {
17  return m_fileBaseName;
18 }
19 
21 {
22  return m_imageNumber;
23 }
24 
26 {
27  return m_principalPoint;
28 }
30 {
31  return m_platformPosition;
32 }
33 
34 const NEWMAT::Matrix& ossimPpjFrameSensorFile::getExtrinsic()const
35 {
36  return m_extrinsicMatrix;
37 }
38 
39 const NEWMAT::Matrix& ossimPpjFrameSensorFile::getIntrinsic()const
40 {
41  return m_intrinsicMatrix;
42 }
43 
45 {
46  return m_imageSize;
47 }
48 
50 {
51  return m_radialDistortion;
52 }
53 
55 {
57 }
58 
60 {
62 }
63 
65 {
66  m_ppjXml = 0;
67  m_principalPoint = ossimDpt(0.0,0.0);
68  m_platformPosition = ossimGpt(0.0,0.0);
69  m_fileBaseName = "";
70  m_imageNumber = -1;
71  m_radialDistortion[0] = 0.0;
72  m_radialDistortion[1] = 0.0;
73  m_tangentialDistortion[0] = 0.0;
74  m_tangentialDistortion[1] = 0.0;
75  m_intrinsicMatrix = NEWMAT::Matrix(3,3);
76  m_extrinsicMatrix = NEWMAT::Matrix(4,4);
77  std::fill(m_intrinsicMatrix.Store(), m_intrinsicMatrix.Store() + 9, 0.0);
78  std::fill(m_extrinsicMatrix.Store(), m_extrinsicMatrix.Store() + 16, 0.0);
79  m_extrinsicMatrix[0][0] = 1.0;
80  m_extrinsicMatrix[1][1] = 1.0;
81  m_extrinsicMatrix[2][2] = 1.0;
82  m_extrinsicMatrix[3][3] = 1.0;
85  m_pointMapList.clear();
86 }
87 
89 {
90  bool result = false;
91  std::ifstream in(file.c_str(), std::ios::in|std::ios::binary);
92  if(in.good()&&readStream(in))
93  {
94 
95  result = true;
96  }
97 
98  return result;
99 }
100 
102 {
103  reset();
105  if(m_ppjXml->read(is))
106  {
108  if(root.valid()&&(root->getTag() == "pearlProjectionFile"))
109  {
110  ossimRefPtr<ossimXmlNode> image = root->findFirstNode("image");
111  if(image.valid())
112  {
113  ossimRefPtr<ossimXmlNode> sensorData = image->findFirstNode("sensorData");
114  ossimRefPtr<ossimXmlNode> namingData = image->findFirstNode("namingData");
115  ossimRefPtr<ossimXmlNode> projectionData = image->findFirstNode("projectionData");
116  if(namingData.valid())
117  {
118  ossimRefPtr<ossimXmlNode> fileBaseName = namingData->findFirstNode("fileBaseName");
119  ossimRefPtr<ossimXmlNode> imageNumber = namingData->findFirstNode("imageNumber");
120  if(fileBaseName.valid())
121  {
122  m_fileBaseName = fileBaseName->getText();
123  }
124  if(imageNumber.valid())
125  {
126  m_imageNumber = imageNumber->getText().toInt64();
127  }
128  }
129  if(projectionData.valid())
130  {
131  const ossimXmlNode::ChildListType& childNodes = projectionData->getChildNodes();
132  ossim_uint32 nNodes = childNodes.size();
133  ossim_uint32 idx = 0;
134  ossim_uint32 averageHeightDivisor = 0;
135  for(idx = 0; idx < nNodes; ++idx)
136  {
137  if(childNodes[idx]->getAttributeValue("type").downcase() == "basic")
138  {
139  ossimRefPtr<ossimXmlNode> pixelPointX = childNodes[idx]->findFirstNode("pixelPointX");
140  ossimRefPtr<ossimXmlNode> pixelPointY = childNodes[idx]->findFirstNode("pixelPointY");
141  ossimRefPtr<ossimXmlNode> ecefX = childNodes[idx]->findFirstNode("ecefX");
142  ossimRefPtr<ossimXmlNode> ecefY = childNodes[idx]->findFirstNode("ecefY");
143  ossimRefPtr<ossimXmlNode> ecefZ = childNodes[idx]->findFirstNode("ecefZ");
144 
145  if(pixelPointX.valid()&&pixelPointY.valid()&ecefX.valid()&&ecefY.valid()&&ecefZ.valid())
146  {
147  PointMap pointMap;
148  pointMap.m_type = BASIC_POINT_TYPE;
149  pointMap.m_point = ossimDpt3d(ecefX->getText().toDouble(), ecefY->getText().toDouble(), ecefZ->getText().toDouble());
150  pointMap.m_pixelPoint = ossimDpt(pixelPointX->getText().toDouble(),pixelPointY->getText().toDouble());
151 
152  ossimGpt gpt(ossimEcefPoint(pointMap.m_point.x, pointMap.m_point.y, pointMap.m_point.z));
153  m_averageProjectedHeight += gpt.height();
154  ++averageHeightDivisor;
155  m_pointMapList.push_back(pointMap);
156  }
157  }
158  }
159  if(averageHeightDivisor > 0) m_averageProjectedHeight /= static_cast<double>(averageHeightDivisor);
160  }
161  if(sensorData.valid())
162  {
163  ossimRefPtr<ossimXmlNode> sensorSize = sensorData->findFirstNode("sensorSize");
164  ossimRefPtr<ossimXmlNode> cameraIntrinsic = sensorData->findFirstNode("cameraIntrinsic");
165  ossimRefPtr<ossimXmlNode> cameraExtrinsic = sensorData->findFirstNode("cameraExtrinsic");
166  if(sensorSize.valid())
167  {
168  ossimRefPtr<ossimXmlNode> width = sensorSize->findFirstNode("SensorWidth");
169  ossimRefPtr<ossimXmlNode> height = sensorSize->findFirstNode("SensorHeight");
170  if(width.valid()&&height.valid())
171  {
172  m_imageSize.x = width->getText().toDouble();
173  m_imageSize.y = height->getText().toDouble();
174  }
175  else
176  {
177  m_ppjXml = 0;
178  }
179  }
180  else
181  {
182  m_ppjXml = 0;
183  }
184  if(m_ppjXml.valid()&&cameraExtrinsic.valid())
185  {
186  if(cameraExtrinsic->getChildNodes().size() == 4)
187  {
188  m_extrinsicMatrix = NEWMAT::Matrix(4,4);
189  std::vector<ossimString> inRow1 = cameraExtrinsic->getChildNodes()[0]->getText().split(" ");
190  std::vector<ossimString> inRow2 = cameraExtrinsic->getChildNodes()[1]->getText().split(" ");
191  std::vector<ossimString> inRow3 = cameraExtrinsic->getChildNodes()[2]->getText().split(" ");
192  std::vector<ossimString> inRow4 = cameraExtrinsic->getChildNodes()[3]->getText().split(" ");
193 
194  if((inRow1.size() ==4)&&
195  (inRow2.size() ==4)&&
196  (inRow3.size() ==4)&&
197  (inRow4.size() ==4))
198  {
199  m_extrinsicMatrix << inRow1[0].toDouble() << inRow1[1].toDouble() << inRow1[2].toDouble()
200  << inRow1[3].toDouble()
201  << inRow2[0].toDouble() << inRow2[1].toDouble() << inRow2[2].toDouble()
202  << inRow2[3].toDouble()
203  << inRow3[0].toDouble() << inRow3[1].toDouble() << inRow3[2].toDouble()
204  << inRow3[3].toDouble()
205  << inRow4[0].toDouble() << inRow4[1].toDouble() << inRow4[2].toDouble()
206  << inRow4[3].toDouble();
207  NEWMAT::ColumnVector v(4);
208  v[0] = v[1] = v[2] = 0.0;
209  v[3] = 1.0;
210  NEWMAT::ColumnVector result = m_extrinsicMatrix*v;
211  m_platformPosition = ossimEcefPoint(result[0], result[1], result[2]);
212  //m_platformPosition;
213  }
214  else
215  {
216  m_ppjXml = 0;
217  }
218 
219  } // end if(cameraExtrinsic->getChildNodes().size() == 4)
220  else
221  {
222  m_ppjXml = 0;
223  }
224 
225  if(m_ppjXml.valid())
226  {
227  if(cameraIntrinsic.valid())
228  {
229  m_intrinsicMatrix = NEWMAT::Matrix(3,3);
230  std::vector<ossimString> inRow1 = cameraIntrinsic->getChildNodes()[0]->getText().split(" ");
231  std::vector<ossimString> inRow2 = cameraIntrinsic->getChildNodes()[1]->getText().split(" ");
232  std::vector<ossimString> inRow3 = cameraIntrinsic->getChildNodes()[2]->getText().split(" ");
233  if((inRow1.size() ==3)&&
234  (inRow2.size() ==3)&&
235  (inRow3.size() ==3))
236  {
237  m_principalPoint.x = inRow1[2].toDouble();
238  m_principalPoint.y = inRow2[2].toDouble();
239  m_intrinsicMatrix << inRow1[0].toDouble() << inRow1[1].toDouble() << m_principalPoint.x
240  << inRow2[0].toDouble() << inRow2[1].toDouble() << m_principalPoint.y
241  << inRow3[0].toDouble() << inRow3[1].toDouble() << inRow3[2].toDouble();
242  }
243  else
244  {
245  m_ppjXml = 0;
246  }
247  } // end if(cameraIntrinsic .....)
248  else
249  {
250  m_ppjXml = 0;
251  }
252  } // end if m_ppjXml ...
253  } // end if(m_ppjXml.valid()&&cameraExtrinsic.valid())
254  else
255  {
256  m_ppjXml = 0;
257  }
258  }
259  else
260  {
261  m_ppjXml = 0;
262  }
263  }
264  else
265  {
266  m_ppjXml = 0;
267  }
268  }
269  else
270  {
271  m_ppjXml = 0;
272  }
273  }
274  else
275  {
276  m_ppjXml = 0;
277  }
278 
279 
280  return m_ppjXml.valid();
281 }
282 
283 // Hidden from use...
285 {
286 }
287 
289  const ossimPpjFrameSensorFile& /* src */)
290 {
291  return *this;
292 }
293 
ossimRefPtr< ossimXmlDocument > m_ppjXml
const NEWMAT::Matrix & getExtrinsic() const
virtual bool readFile(const ossimFilename &file)
DoubleArrayType m_tangentialDistortion
std::basic_ifstream< char > ifstream
Class for char input file streams.
Definition: ossimIosFwd.h:44
bool valid() const
Definition: ossimRefPtr.h:75
ossim_int64 getImageNumber() const
const ossimXmlNode::ChildListType & getChildNodes() const
ossimString const & getTag() const
Definition: ossimXmlNode.h:53
double y
Definition: ossimDpt.h:165
const ossimString & getBaseName() const
const ossimRefPtr< ossimXmlNode > & findFirstNode(const ossimString &rel_xpath) const
const ossimDpt & getImageSize() const
std::vector< ossimRefPtr< ossimXmlNode > > ChildListType
Definition: ossimXmlNode.h:30
const ossimString & getText() const
Definition: ossimXmlNode.h:92
double z
Definition: ossimDpt3d.h:145
const ossimDpt & getPrincipalPoint() const
ossimPpjFrameSensorFile & operator=(const ossimPpjFrameSensorFile &src)
unsigned int ossim_uint32
double toDouble() const
const DoubleArrayType & getTangentialDistortion() const
const DoubleArrayType & getRadialDistortion() const
std::basic_istream< char > istream
Base class for char input streams.
Definition: ossimIosFwd.h:20
const ossimGpt & getPlatformPosition() const
double x
Definition: ossimDpt.h:164
double x
Definition: ossimDpt3d.h:143
long long ossim_int64
const char * c_str() const
Returns a pointer to a null-terminated array of characters representing the string&#39;s contents...
Definition: ossimString.h:396
bool read(std::istream &in)
ossim_int64 toInt64() const
const NEWMAT::Matrix & getIntrinsic() const
ossimRefPtr< ossimXmlNode > getRoot()
std::vector< ossim_float64 > DoubleArrayType
double y
Definition: ossimDpt3d.h:144
virtual bool readStream(std::istream &is)
void makeNan()
Definition: ossimDpt.h:65