From a25c8887e854a9926ee942bf11e45dad74c10489 Mon Sep 17 00:00:00 2001 From: Emmanuel Christophe <emmanuel.christophe@orfeo-toolbox.org> Date: Mon, 3 Dec 2007 16:43:38 +0000 Subject: [PATCH] Tutorial OrthoFusion --- Examples/Tutorials/OrthoFusion.cxx | 262 +++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 Examples/Tutorials/OrthoFusion.cxx diff --git a/Examples/Tutorials/OrthoFusion.cxx b/Examples/Tutorials/OrthoFusion.cxx new file mode 100644 index 0000000000..f0ea7b534d --- /dev/null +++ b/Examples/Tutorials/OrthoFusion.cxx @@ -0,0 +1,262 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#if defined(_MSC_VER) +#pragma warning ( disable : 4786 ) +#endif + +// Software Guide : BeginLatex +// +// Start by including some necessary headers and with the +// usual \code{main} declaration. Apart from the classical header related to +// image input and output. We need the headers related to the fusion and the +// orthorectification. One header is also required to be able to process +// vector images (the XS one) with the orthorectification. +// +// Software Guide : EndLatex + +// Software Guide : BeginCodeSnippet + +// iostream is used for general output +// #include <iostream> +// #include <iterator> +// #include <stdlib.h> + +#include "otbMacro.h" +#include "otbImage.h" +#include "otbVectorImage.h" +#include "otbImageFileReader.h" +#include "otbStreamingImageFileWriter.h" +// #include "otbStreamingResampleImageFilter.h" + + +#include "itkChangeInformationImageFilter.h" +#include "otbPerBandVectorImageFilter.h" + +#include "otbBayesianFusionFilter.h" + +#include "init/ossimInit.h" + +#include "otbOrthoRectificationFilter.h" +#include "otbMapProjections.h" + + + +int main( int argc, char* argv[] ) +{ +// Software Guide : EndCodeSnippet + + + // Software Guide : BeginLatex + // + // We initialize ossim which is required for the orthorectification and we + // check that all parameters are provided. Basically, we need + // \begin{itemize} + // \item the name of the input PAN image; + // \item the name of the input XS image; + // \item the desired name for the output; + // \item as the coordinates are given in UTM, we need the UTM zone number; + // \item of course, we need the UTM coordinates of the final image; + // \item the size in pixels of the final image; + // \item and the sampling of the final image. + // \end{itemize} + // + // We check that all those parameters are provided. + // +// Software Guide : EndLatex + +// Software Guide : BeginCodeSnippet + ossimInit::instance()->initialize(argc, argv); + + if(argc!=11) + { + std::cout << argv[0] <<" <input_pan_filename> <input_xs_filename> <output_filename> <utm zone> <x_ground_upper_left_corner> <y_ground_upper_left_corner> <x_Size> <y_Size> <x_groundSamplingDistance> <y_groundSamplingDistance (should be negative since origin is upper left)>" + << std::endl; + + return EXIT_FAILURE; + } +// Software Guide : EndCodeSnippet + + // Software Guide : BeginLatex + // + // We declare the different images, readers and writer: + // + // Software Guide : EndLatex + +// Software Guide : BeginCodeSnippet + typedef otb::Image<unsigned int, 2> ImageType; + typedef otb::VectorImage<unsigned int, 2> VectorImageType; + typedef otb::ImageFileReader<ImageType> ReaderType; + typedef otb::ImageFileReader<VectorImageType> VectorReaderType; + typedef otb::StreamingImageFileWriter<VectorImageType> WriterType; + + + ReaderType::Pointer readerPAN=ReaderType::New(); + VectorReaderType::Pointer readerXS=VectorReaderType::New(); + WriterType::Pointer writer=WriterType::New(); + + readerPAN->SetFileName(argv[1]); + readerXS->SetFileName(argv[2]); + writer->SetFileName(argv[3]); +// Software Guide : EndCodeSnippet + + + // Software Guide : BeginLatex + // + // We declare the projection (here we chose the UTM projection, other choice + // are possible). We also declare the orthorectification filter. Note that + // the \doxygen{otb}{OrthoRectificationFilter} is designed to work with one + // band images. To be able to process the XS image (which are + // \doxygen{otb}{VectorImage}), we need to use the + // \doxygen{otb}{PerBandVectorImageFilter} which is going to apply the filter + // set via the method \code{SetFilter()} to all spectral bands. + // + // Software Guide : EndLatex + +// Software Guide : BeginCodeSnippet + + + typedef otb::UtmInverseProjection utmMapProjectionType ; + typedef otb::OrthoRectificationFilter<ImageType, ImageType, + utmMapProjectionType> OrthoRectifFilterType ; + typedef otb::PerBandVectorImageFilter<VectorImageType, VectorImageType, OrthoRectifFilterType> VectorOrthoRectifFilterType; + + OrthoRectifFilterType::Pointer orthoRectifPAN = + OrthoRectifFilterType::New(); + OrthoRectifFilterType::Pointer orthoRectifXS = + OrthoRectifFilterType::New(); + VectorOrthoRectifFilterType::Pointer orthoRectifXSVector = + VectorOrthoRectifFilterType::New(); + orthoRectifXSVector->SetFilter(orthoRectifXS); + + utmMapProjectionType::Pointer utmMapProjection = + utmMapProjectionType::New(); + utmMapProjection->SetZone(atoi(argv[4])); + utmMapProjection->SetHemisphere('N'); + orthoRectifPAN->SetMapProjection(utmMapProjection); + orthoRectifXS->SetMapProjection(utmMapProjection); +// Software Guide : EndCodeSnippet + + // Software Guide : BeginLatex + // + // ************** This shouldn't be necessary any more !!!********** + // + // Software Guide : EndLatex + +// Software Guide : BeginCodeSnippet + + ImageType::PointType originNull; + originNull[0]=0; + originNull[1]=0; + + + readerPAN->GenerateOutputInformation(); + + typedef itk::ChangeInformationImageFilter<ImageType > ChangeInfoFilterType; + ChangeInfoFilterType::Pointer changeInfoPAN = ChangeInfoFilterType::New(); + changeInfoPAN->SetInput(readerPAN->GetOutput()); + changeInfoPAN->ChangeOriginOn(); + changeInfoPAN->SetOutputOrigin(originNull); + changeInfoPAN->GenerateOutputInformation(); + orthoRectifPAN->SetInput(changeInfoPAN->GetOutput()); + + + readerXS->GenerateOutputInformation(); + + typedef itk::ChangeInformationImageFilter<VectorImageType > VectorChangeInfoFilterType; + VectorChangeInfoFilterType::Pointer changeInfoXS = VectorChangeInfoFilterType::New(); + changeInfoXS->SetInput(readerXS->GetOutput()); + changeInfoXS->ChangeOriginOn(); + changeInfoXS->SetOutputOrigin(originNull); + changeInfoXS->GenerateOutputInformation(); + orthoRectifXSVector->SetInput(changeInfoXS->GetOutput()); + + // Software Guide : EndCodeSnippet + + // Software Guide : BeginLatex + // + // We now pass the orthorectification parameters to the orthorectification + // filters: + // + // Software Guide : EndLatex + +// Software Guide : BeginCodeSnippet + + ImageType::IndexType start; + start[0]=0; + start[1]=0; + orthoRectifPAN->SetOutputStartIndex(start); + orthoRectifXS->SetOutputStartIndex(start); + + ImageType::SizeType size; + size[0]=atoi(argv[7]); + size[1]=atoi(argv[8]); + orthoRectifPAN->SetSize(size); + orthoRectifXS->SetSize(size); + + ImageType::SpacingType spacing; + spacing[0]=atof(argv[9]); + spacing[1]=atof(argv[10]); + orthoRectifPAN->SetOutputSpacing(spacing); + orthoRectifXS->SetOutputSpacing(spacing); + + ImageType::PointType origin; + origin[0]=strtod(argv[5], NULL); + origin[1]=strtod(argv[6], NULL); + orthoRectifPAN->SetOutputOrigin(origin); + orthoRectifXS->SetOutputOrigin(origin); + + // Software Guide : EndCodeSnippet + + // Software Guide : BeginLatex + // + // It's time to declare the fusion filter and set its inputs: + // + // Software Guide : EndLatex + +// Software Guide : BeginCodeSnippet + + typedef otb::BayesianFusionFilter< VectorImageType, VectorImageType, ImageType, VectorImageType > BayesianFusionFilterType; + BayesianFusionFilterType::Pointer bayesianFilter = BayesianFusionFilterType::New(); + + bayesianFilter->SetMultiSpect(orthoRectifXSVector->GetOutput() ); + bayesianFilter->SetMultiSpectInterp(orthoRectifXSVector->GetOutput() ); + bayesianFilter->SetPanchro(orthoRectifPAN->GetOutput() ); + + + // Software Guide : EndCodeSnippet + + // Software Guide : BeginLatex + // + // And we can plug it to the writer. To be able to process the images by + // tiles, we use the \code{SetTilingStreamDivisions()} method of the writer. + // We trigger the pipeline execution with the \code{Update()} method. + // + // Software Guide : EndLatex + + // Software Guide : BeginCodeSnippet + + writer->SetInput(bayesianFilter->GetOutput()); + + writer->SetTilingStreamDivisions(20); + + writer->Update(); + + return EXIT_SUCCESS; + +} + // Software Guide : EndCodeSnippet \ No newline at end of file -- GitLab