Compare image metadata in --compare-metadata
Summary
Compare the otb::ImageMetadata
object of baseline and test images in the --compare-metadata
.
Rationale
Image metadata are now stored in a otb::ImageMetadata
object (see !707 (merged)). But there are currently no systematic way of comparing the metadata of two images (there are unit test for metadata parsing in Modules/Core/Metadata thought). This MR is a refactoring of --compare-metadata
to actually use otb::ImageMetadata
to compare the metadata, instead of comparing only a part of metadata (it currently compares GCPs, geoTransform, projection and corners).
TileHint and Datatype metadatas are not tested, as they depend of the output format (the gdal driver used) and image type.
Two test have been added to test the functionality.
The first one uses the same file as test and baseline images:
otb_add_test(NAME tsTvCompareMetadata1 COMMAND otbTestKernelTestDriver
--compare-metadata 0
LARGEINPUT{SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043}
LARGEINPUT{SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043}
otbDummyTest
)
The second one uses different files, with different metadata, and should fail:
otb_add_test(NAME tsTvCompareMetadata2 COMMAND otbTestKernelTestDriver
--compare-metadata 0
${OTB_DATA_LARGEINPUT_ROOT}/PLEIADES-PRE/TLSE_JP2_ORTHO_DIMAPv2_PMS-N_lossy_12bits/IMG_PHR1Z_PMS_N_001/IMG_PHR1A_PMS-N_201006181052297_ORT_IPU_20111011_0619-001_R1C1.JP2
${OTB_DATA_LARGEINPUT_ROOT}/PLEIADES-PRE/TLSE_TIFF_ORTHO_DIMAPv2_MS_lossless_8bits/IMG_PHR1A_MS_002/IMG_PHR1A_MS_201006181052297_ORT_IPU_20111109_7807-004_R1C1.TIF
otbDummyTest
)
set_property(TEST tsTvCompareMetadata2 PROPERTY WILL_FAIL true)
Implementation Details
With the exception of MDGeom, all type of metadata (MDNum
: double, MDStr
: std::string, MDL1D
: lut 1D, MDL2D
: lut 2D, MDTime
dates and ExtraKeys: std::string
) are compared between baseline and test metadata. The comparison is done by comparing each element of the corresponding std::map in both metadata objects (associative container). The comparison is done using the ==
operator, with the exception of MDNum metadata which are compared relatively to a tolerance.
In the case of MDGeom metadatas the comparison needs to be done by hand, as the actual type of MDGeom is unknown. This is implemeted for RPC coefficients, GCPs and projection.
This MR also implements a few ==
operators for metadata types : otb::Time
, otb::Projection::RPCParam
and LUT<unsigned int dim>
Additional notes
A template<class T> std::string otb::Metadata::EnumToString(T t)
function has been implemented to be able to get the name of a metadata in a generic way. This method is specialized for the different types of metadata and uses the boost::bimap of correspondance between enums and std::string
. This function is used to generate the logs in --compare-metadata
for example otb::Metadata::EnumToString(MDNum::NoData) returns "NoData"
.
Copyright
The copyright owner is CNES and has signed the ORFEO ToolBox Contributor License Agreement.
Check before merging:
- All discussions are resolved
- At least 2
👍 votes from core developers, no👎 vote. - The feature branch is (reasonably) up-to-date with the base branch
- Dashboard is green
- Copyright owner has signed the ORFEO ToolBox Contributor License Agreement
- Optionally, run
git diff develop... -U0 --no-color | clang-format-diff.py -p1 -i
on latest changes and commit