# RightAngleDetectionExample.cxx¶

Example usage:

./RightAngleDetectionExample Input/Scene.png Output/rightAngleOutput.shp 0.1 20


Example source code (RightAngleDetectionExample.cxx):

#include "otbImageFileReader.h"
#include "otbLineSegmentDetector.h"
#include "otbVectorDataFileWriter.h"

// This example illustrates the use of the
// \doxygen{otb}{VectorDataToRightAngleVectorDataFilter}.
// This filter detects the right angles in an image by exploiting the
// output of a line detection algorithm. Typically the
// \doxygen{otb}{LineSegmentDetector} class will be used. The right
// angle detection algorithm is described in detail in
// \cite{RightAngleDetection}.
//
// The first step required to use this filter is to include its header file.

#include "otbVectorDataToRightAngleVectorDataFilter.h"

int main(int argc, char* argv[])
{
if (argc != 5)
{
std::cerr << "Usage: ./RightAngleDetectionExample input rightAngleOutput angleThreshold distanceThreshold\n";
return EXIT_FAILURE;
}

const char* infname                  = argv[1];
const char* rightAngleOutputFilename = argv[2];
double      angleThreshold           = atof(argv[3]);
double      distanceThreshold        = atof(argv[4]);

const unsigned int Dimension = 2;
using PixelType              = unsigned char;
using PrecisionType          = double;

using ImageType  = otb::Image<PixelType, Dimension>;

// After defining, as usual, the types for the input image and the
// image reader, we define the specific types needed for this
// example. First of all, we will use a vector data
// to store the detected lines which will be provided by the line
// segment detector.

using VectorDataType = otb::VectorData<PrecisionType>;
// The right angle detector's output is a vector data where each point
// gives the coordinate of the detected angle.
//
// Next, We define the type for the line segment detector. A detailed
// example for this detector can be found in section \ref{sec:LSD}.

using LsdFilterType = otb::LineSegmentDetector<ImageType, PrecisionType>;

// We can finally define the type for the right angle detection
// filter. This filter is templated over the input vector data type
// provided by the line segment detector.

using RightAngleFilterType = otb::VectorDataToRightAngleVectorDataFilter<VectorDataType>;

// We instantiate the line segment detector and the right angle detector.

auto lsdFilter        = LsdFilterType::New();
auto rightAngleFilter = RightAngleFilterType::New();

// We plug the pipeline.

rightAngleFilter->SetInput(lsdFilter->GetOutput());

// You can choose how far the right angle segments can be, and the tolerance
// to consider an angle between two segments as an right one.

rightAngleFilter->SetAngleThreshold(angleThreshold);
rightAngleFilter->SetDistanceThreshold(distanceThreshold);

using WriterType = otb::VectorDataFileWriter<LsdFilterType::VectorDataType>;

auto rightAngleWriter = WriterType::New();

rightAngleWriter->SetInput(rightAngleFilter->GetOutput());
rightAngleWriter->SetFileName(rightAngleOutputFilename);

// Before calling the \code{Update()} method of the writers in order to
// trigger the pipeline execution, we call the
// \code{GenerateOutputInformation()} of the reader, so the
// filter gets the information about image size and spacing.