14 # include <vcl_msvc_warnings.h> 16 #include <vil/vil_load.h> 18 #include <vil/file_formats/vil_nitf2_image.h> 21 static int to_int (
const char* in_string,
int size)
25 value = (value*10) + (*in_string++ -
'0');
36 const char* orig = in_string;
39 char sposdir, cposdir, snegdir, cnegdir;
59 while ((*in_string ==
' ') || (*in_string ==
'\t'))
62 for (length=0; std::isdigit (*in_string) &&
length<15; ++
length)
64 if (length>14)
return 0;
74 if ((min = to_int (in_string-4, 2)) >= 60 ||
min<0)
78 if ((deg = to_int (in_string-length, length-4)) >
maxval || deg<0)
83 char* temp =
new char[2];
85 (*in_string==
'.' || std::isdigit (*in_string)) && length<15;
88 if (length>14)
return 0;
90 std::strncpy(temp,in_string-length,length);
91 if ( (fsec = (
float)std::atof(temp)) >= 60.0f || fsec<0.0f)
96 while ((*in_string ==
' ') || (*in_string ==
'\t'))
101 *val += ((double)(min))/(60.0);
102 *val += ((double)(fsec))/(3600.0);
105 if ( *in_string==sposdir || *in_string==cposdir) {}
106 else if ( *in_string==snegdir || *in_string==cnegdir) {*val = -(*val);}
111 return static_cast<int>(in_string - orig);
114 if (*in_string ==
'd')
119 if ((deg = to_int (in_string-length, length)) > maxval || deg<0)
124 while ((*in_string ==
' ') || (*in_string ==
'\t'))
128 for (length=0; std::isdigit (*in_string) &&
length<15; ++in_string, ++
length) ;
129 if (length>14)
return 0;
132 if ((min = to_int (in_string-length, length)) >= 60 ||
min<0)
137 while ((*in_string ==
' ') || (*in_string ==
'\t'))
141 char* temp=
new char[2];
143 (*in_string==
'.' || std::isdigit (*in_string)) && length<15;
146 if (length>14)
return 0;
148 std::strncpy(temp,in_string-length,length);
149 if ( (fsec = (
float)std::atof(temp)) >= 60.0f || fsec<0.0f)
155 while ((*in_string ==
' ') || (*in_string ==
'\t'))
160 *val += ((double)(min))/(60.0);
161 *val += ((double)(fsec))/(3600.0);
164 if ( *in_string==sposdir || *in_string==cposdir) {}
165 else if ( *in_string==snegdir || *in_string==cnegdir) {*val = -(*val);}
170 return static_cast<int>(in_string - orig);
173 if (*in_string ==
' ' || *in_string ==
'-' || *in_string ==
'+' 174 || *in_string ==
'.' || *in_string ==
'\0')
176 char* temp=
new char[2];
180 while ((*in_string ==
' ') || (*in_string ==
'\t'))
185 (*in_string==
'+' ||*in_string==
'-' || *in_string==
'.' ||
186 std::isdigit (*in_string)) && length<15;
189 if (length>14)
return 0;
192 std::strncpy(temp,in_string-length,length);
193 *val = std::atof(temp);
194 if (std::fabs(*val)>
float(maxval))
return 0;
199 return static_cast<int>(in_string - orig);
206 static int geostr_to_latlon(
const char* str,
double* lat,
double* lon)
209 if (latstrlen == 0)
return 0;
212 if ( lonstrlen == 0)
return 0;
214 return latstrlen+lonstrlen;
244 init(vil_nitf2_image* nitf_image,
bool verbose)
246 std::vector< vil_nitf2_image_subheader* > headers = nitf_image->get_image_headers();
247 vil_nitf2_image_subheader* hdr = headers[0];
251 for (
double & i : tre_data) i = 0;
258 std::cout <<
"Failed to get rational camera parameters from nitf image in" 259 <<
" vgpl_nitf_rational_camera\n";
285 std::cout <<
"ULlon " << ULlon <<
" ULlat " << ULlat <<
'\n' 286 <<
"URlon " << URlon <<
" URlat " << URlat <<
'\n' 287 <<
"LRlon " << LRlon <<
" LRlat " << LRlat <<
'\n' 288 <<
"LLlon " << LLlon <<
" lLlat " << LLlat <<
'\n';
297 std::cout <<
"Unknown rational type from nitf image in" 298 <<
" vgpl_nitf_rational_camera\n";
304 for (
int i=0; i<20; i++)
323 double correction_u_off,correction_v_off;
324 success=hdr->get_correction_offset(correction_u_off,correction_v_off);
342 vil_image_resource_sptr image =
343 vil_load_image_resource(nitf_image_path.c_str());
346 std::cout <<
"Image load failed in vpgl_nitf_rational_camera_constructor\n";
349 std::string format = image->file_format();
350 std::string prefix = format.substr(0,4);
351 if (prefix !=
"nitf")
353 std::cout <<
"not a nitf image in vpgl_nitf_rational_camera_constructor\n";
357 auto* nitf_image = (vil_nitf2_image*)image.ptr();
359 if (!this->
init(nitf_image, verbose))
362 double z_off = z.
offset();
365 double ul_u=0, ul_v=0, ur_u=0, ur_v=0, ll_u=0, ll_v=0, lr_u=0, lr_v=0;
368 std::cout <<
"Upper left image corner(" << ul_u <<
' ' << ul_v <<
")\n";
371 std::cout <<
"Upper right image corner(" << ur_u <<
' ' << ur_v <<
")\n";
374 std::cout <<
"Lower left image corner(" << ll_u <<
' ' << ll_v <<
")\n";
377 std::cout <<
"Lower right image corner(" << lr_u <<
' ' << lr_v <<
")\n";
385 if (!this->
init(nitf_image, verbose))
391 double z_off = z.
offset();
394 double ul_u=0, ul_v=0, ur_u=0, ur_v=0, ll_u=0, ll_v=0, lr_u=0, lr_v=0;
397 std::cout <<
"Upper left image corner(" << ul_u <<
' ' << ul_v <<
")\n";
400 std::cout <<
"Upper right image corner(" << ur_u <<
' ' << ur_v <<
")\n";
403 std::cout <<
"Lower left image corner(" << ll_u <<
' ' << ll_v <<
")\n";
406 std::cout <<
"Lower right image corner(" << lr_u <<
' ' << lr_v <<
")\n";
vpgl_nitf_rational_camera()
vnl_matrix_fixed< double, 4, 20 > rational_coeffs_
bool init(vil_nitf2_image *nitf_image, bool verbose)
std::vector< vpgl_scale_offset< double > > scale_offsets_
std::string nitf_rational_type_
T maxval(vbl_array_1d< T > const &in)
vnl_double_2 ul_
geo-coordinates of image corners.
vnl_decnum min(vnl_decnum const &x, vnl_decnum const &y)
double offset(const coor_index coor_index) const
get a specific offset value.
double length(v const &a)
std::string image_igeolo_
: instance a nitf_rational camera from nitf header information.
void project(const double x, const double y, const double z, double &u, double &v) const override
The generic camera interface. u represents image column, v image row.