Skip to content
Snippets Groups Projects
Commit 7089f544 authored by Julien Michel's avatar Julien Michel
Browse files

MRG

parents 466b5536 56f03a7f
No related branches found
No related tags found
No related merge requests found
......@@ -249,7 +249,6 @@ LineSegmentDetector<TInputImage, TPrecision>
/** Compute the rectangle*/
CoordinateHistogramIteratorType ItRegion = m_RegionList.begin();
DirectionVectorIteratorType ItDir = m_DirectionVector.begin();
std::cout << " NB DE REGIONS : "<< m_RegionList.size()<< std::endl;
while(ItRegion != m_RegionList.end() && ItDir !=m_DirectionVector.end() )
{
......
......@@ -123,11 +123,11 @@ protected:
/**
* Distance between segments computation
*/
virtual float ComputeDistanceBetweenSegments(LineType * lineDst , LineType * lineSrc);
virtual double ComputeDistanceBetweenSegments(LineType * lineDst , LineType * lineSrc);
/**
* Angle computation
*/
virtual float ComputeAngleFormedBySegments(LineType * lineDst , LineType * lineSrc);
virtual double ComputeAngleFormedBySegments(LineType * lineDst , LineType * lineSrc);
/**
* When we find a right angle, one compute the coordinate of the segments intersection
*/
......@@ -137,6 +137,12 @@ protected:
*/
virtual void AddRightAngleToPointSet(PointType rAngle , LineType * LineDst , LineType* LineCur );
/**
* Compute the orienation of a segment
*/
virtual double ComputeOrientation(LineType* line);
private:
......
......@@ -37,9 +37,8 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
this->SetNumberOfRequiredInputs(2);
this->SetNumberOfRequiredOutputs(1);
m_ThresholdDistance = 5.;
m_ThresholdDistance = 20.;
m_ThresholdAngle = M_PI/36.; //36 cause we want 5 degrees threshold
}
/**
......@@ -100,31 +99,31 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
while(itLinesListCur != itLinesListCurEnd )
{
/** Check If segments are already computed */
if( segmentsUsedMatrix[counterTest][counterCur]== 0 && segmentsUsedMatrix[counterCur][counterTest] == 0 )
{
if( segmentsUsedMatrix[counterTest][counterCur]== 0 && segmentsUsedMatrix[counterCur][counterTest] == 0 )
{
/** Set the segments to USED (== 1)*/
segmentsUsedMatrix[counterTest][counterCur] = 1;
segmentsUsedMatrix[counterCur][counterTest] = 1;
/** Compute the distance from CurLine to DstLine*/
float SegmentDist = this->ComputeDistanceBetweenSegments(*itLinesListTest , *itLinesListCur);
/** Check if the distance separating the segments is under the threshold*/
if(SegmentDist < m_ThresholdDistance /* Threshold : 5 Pixels*/)
{
/** Compute the angle formed by the two segments */
float Angle = this->ComputeAngleFormedBySegments(*itLinesListTest, *itLinesListCur);
/** Check if the angle is a right one */
if(vcl_abs(Angle - M_PI/2.) <= m_ThresholdAngle )
/** Compute the angle formed by the two segments */
double Angle = this->ComputeAngleFormedBySegments(*itLinesListTest, *itLinesListCur);
/** Check if the angle is a right one */
if(vcl_abs(Angle - M_PI/2.) < m_ThresholdAngle )
{
/** Compute the distance from CurLine to DstLine*/
double SegmentDist = this->ComputeDistanceBetweenSegments(*itLinesListTest , *itLinesListCur);
/** Check if the distance separating the segments is under the threshold*/
if(SegmentDist < m_ThresholdDistance )
{
/** Right angle coordinate*/
/** Right angle coordinate*/
PointType RightAngleCoordinate;
RightAngleCoordinate = this->ComputeAngleRightCoordinate(*itLinesListTest, *itLinesListCur);
/** If Right Angle: Add it to the pointSet*/
this->AddRightAngleToPointSet(RightAngleCoordinate , *itLinesListTest , *itLinesListCur );
}
}
}
......@@ -140,7 +139,7 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
* Method : ComputeDistanceBetweenSegments
*/
template <class TImage, class TLinesList , class TPointSet>
float
double
LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
::ComputeDistanceBetweenSegments(LineType * lineDst , LineType * lineSrc)
{
......@@ -159,21 +158,6 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
/** Verify if the indexes of the line are inside the region*/
typename InputImageType::SizeType size = this->GetInputImage()->GetRequestedRegion().GetSize();
//unsigned int width = size[0];
//unsigned int length = size[1];
// if(IndexBeginSrc[0] > width) IndexBeginSrc[0] = width-1;
// if(IndexBeginSrc[1] > length) IndexBeginSrc[1] = length-1;
// if(IndexEndSrc[0] > width) IndexEndSrc[0] = width-1;
// if(IndexEndSrc[1] > length) IndexEndSrc[1] = length-1;
// if(IndexBeginSrc[0] <0) IndexBeginSrc[0] = 0;
// if(IndexBeginSrc[1] <0) IndexBeginSrc[1] = 0;
// if(IndexEndSrc[0]<0) IndexEndSrc[0] = 0;
// if(IndexEndSrc[1]<0) IndexEndSrc[1] = 0;
/** Extract Indexes from the Dst line to instantiate the line iterator*/
typename LineType::PointListType &pointsListDst = lineDst->GetPoints();
......@@ -196,7 +180,7 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
itk::LineIterator<InputImageType> itLine(this->GetInputImage() , IndexBeginSrc , IndexEndSrc);
itLine.GoToBegin();
float MinDistance = 10000.;
double MinDistance = 10000.;
while(!itLine.IsAtEnd())
{
......@@ -204,12 +188,12 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
if(this->GetInputImage()->GetRequestedRegion().IsInside(IndexCur) )
{
float xp = static_cast<float>(itLine.GetIndex()[0]);
float yp = static_cast<float>(itLine.GetIndex()[1]);
float Num = vcl_abs(xp*(Yq1-Yq2) + yp*(Xq2-Xq1) + CrossProduct);
double xp = static_cast<float>(itLine.GetIndex()[0]);
double yp = static_cast<float>(itLine.GetIndex()[1]);
double Num = vcl_abs(xp*(Yq1-Yq2) + yp*(Xq2-Xq1) + CrossProduct);
/** distance from Point P to Segment Q1Q2*/
float CurDistance = Num/SegmentLength;
double CurDistance = Num/SegmentLength;
if(CurDistance < MinDistance )
MinDistance = CurDistance;
......@@ -228,42 +212,43 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
*
*/
template <class TImage, class TLinesList , class TPointSet>
float
double
LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
::ComputeAngleFormedBySegments(LineType * lineDst , LineType * lineSrc)
{
/** ----- */
typename LineType::PointListType & pointsList = lineSrc->GetPoints();
typename LineType::PointListType::const_iterator itPoints = pointsList.begin();
double oriDst = this->ComputeOrientation(lineDst);
double oriSrc = this->ComputeOrientation(lineSrc);
return vcl_abs(oriDst - oriSrc);
}
/**
* Method : ComputeDistanceBetweenSegments
*/
template <class TImage, class TLinesList , class TPointSet>
double
LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
::ComputeOrientation(LineType * line)
{
typename LineType::PointListType & pointsList = line->GetPoints();
typename LineType::PointListType::const_iterator itPoints = pointsList.begin();
float Xp1 = (*itPoints).GetPosition()[0];
float Yp1 = (*itPoints).GetPosition()[1];
++itPoints;
float Xp2 = (*itPoints).GetPosition()[0];
float Yp2 = (*itPoints).GetPosition()[1];
/** Extract Indexes from the Dst line to instantiate the line iterator*/
typename LineType::PointListType &pointsListDst = lineDst->GetPoints();
typename LineType::PointListType::const_iterator itPointsDst = pointsListDst.begin();
float Yp2 = (*itPoints).GetPosition()[1];
float Xq1 = (*itPointsDst).GetPosition()[0]; //xq1
float Yq1 = (*itPointsDst).GetPosition()[1]; //yq1
++itPointsDst;
float Xq2 = (*itPointsDst).GetPosition()[0]; //xq2
float Yq2 = (*itPointsDst).GetPosition()[1]; //yq2
/** Vectors support computation */
float SegmentLengthP = vcl_sqrt( (Xp1-Xp2)* (Xp1-Xp2) + (Yp1-Yp2) *(Yp1-Yp2) );
float SegmentLengthQ = vcl_sqrt( (Xq1-Xq2)* (Xq1-Xq2) + (Yq1-Yq2) *(Yq1-Yq2) );
float X = vcl_abs((Xp1 - Xp2)*(Xq1-Xq2));
float Y = vcl_abs((Yp1 - Yp2)*(Yq1-Yq2));
//Compute the orientation
double dx = Xp1 - Xp2;
double dy = Yp1 - Yp2 ;
double orientation = vcl_atan2(dy,dx);
if(orientation < 0)
orientation += M_PI;
float angle = vcl_acos( ( X + Y )/( SegmentLengthP * SegmentLengthQ )); //Scalar Product
return angle;
return orientation ;
}
/**
* Method : ComputeDistanceBetweenSegments
*/
......@@ -295,7 +280,6 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
float Xq2 = (*itPointsDst).GetPosition()[0]; //xq2
float Yq2 = (*itPointsDst).GetPosition()[1]; //yq2
//std::cout << "Xp1 " <<Xp1 <<" Yp1 " << Yp1 << " Xp2 " << Xp2 << " Yp2 "<<Yp2 << " Xq1 " <<Xq1 << " Yq1 "<< Yq1 << " Xq2 " << Xq2<< " Yq2 " << Yq2 << std::endl;
/** Compute the equation of the lines A and B which are support of the segments Src & Dst*/
// - Line 1 : slope and origin
......@@ -353,7 +337,7 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
{
unsigned int CurrentPos = m_OutputPointSet->GetNumberOfPoints();
m_OutputPointSet->SetPoint(CurrentPos ,rAngle );
m_OutputPointSet->SetPoint(CurrentPos ,rAngle);
VectorLineType vectorLine;
vectorLine.push_back(LineDst);
vectorLine.push_back(LineCur);
......@@ -370,6 +354,7 @@ LineSpatialObjectListToRightAnglePointSetFilter<TImage,TLinesList ,TPointSet>
::PrintSelf(std::ostream& os, itk::Indent indent) const
{
Superclass::PrintSelf( os, indent );
}
......
......@@ -337,6 +337,21 @@ ADD_TEST(CloudDetectionExampleTest ${EXE_TESTS2}
553 467 734 581 0.4 0.6 1.0
)
# ------- Right Angle Detection test----------
ADD_TEST(RightAngleDetectionExample ${EXE_TESTS2}
--compare-image ${TOL}
${BASELINE}/RightAngleOutput.png
${TEMP}/PrettyRightAngleOutput.png
RightAngleDetectionExample
${INPUTDATA}/qb_RoadExtract2.tif
${TEMP}/RighAngleOutput.tif
${TEMP}/PrettyRightAngleInput.png
${TEMP}/PrettyRightAngleOutput.png
0.09
20.
)
ADD_EXECUTABLE(otbFeatureExtractionExamplesTests1 otbFeatureExtractionExamplesTests1.cxx)
TARGET_LINK_LIBRARIES(otbFeatureExtractionExamplesTests1 ITKAlgorithms ITKStatistics OTBBasicFilters OTBCommon OTBDisparityMap OTBIO OTBSpatialReasoning OTBChangeDetection OTBFeatureExtraction OTBLearning OTBMultiScale)
......
/*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt for details.
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.
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.
=========================================================================*/
......@@ -28,10 +28,12 @@
#include "otbLineSpatialObjectList.h"
#include "otbDrawLineSpatialObjectListFilter.h"
#include "otbLineSegmentDetector.h"
#include "itkMinimumMaximumImageCalculator.h"
// Software Guide : BeginCommandLineArgs
// INPUTS: {qb_RoadExtract2.tif}
// OUTPUTS: {RighAngleOutput.tif}, {PrettyRighAngleInput.png}, {PrettyRighAngleOutput.png}
// OUTPUTS: {RighAngleOutput.tif}, {PrettyRighAngleInput.png}, {PrettyRighAngleOutput.png}
// 0.09 20
// Software Guide : EndCommandLineArgs
// Software Guide : BeginLatex
......@@ -58,6 +60,9 @@ int main( int argc, char * argv[] )
const char * outfname = argv[2];
const char * inprettyfname = argv[3];
const char * outprettyfname = argv[4];
double angleThreshold = atof(argv[5]);
double distanceThreshold = atof(argv[6]);
const unsigned int Dimension = 2;
typedef float PixelType;
......@@ -70,115 +75,131 @@ int main( int argc, char * argv[] )
reader->SetFileName(infname);
WriterType::Pointer writer = WriterType::New();
// Software Guide : BeginLatex
//
// 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 list of line spatial objects
// to store the detected lines which will be provided by the line
// segment detector.
//
// Software Guide : EndLatex
// Software Guide : BeginLatex
//
// 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 list of line spatial objects
// to store the detected lines which will be provided by the line
// segment detector.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginCodeSnippet
typedef otb::LineSpatialObjectList LinesListType;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// The right angle detector's output is a pointset where each point
// gives the coordinate of the detected angle. In the data field of
// the pointset, the 2 lines which define the right angle are stored
// in a vector. Therefore we define the 2 following types.
//
// Software Guide : EndLatex
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// The right angle detector's output is a pointset where each point
// gives the coordinate of the detected angle. In the data field of
// the pointset, the 2 lines which define the right angle are stored
// in a vector. Therefore we define the 2 following types.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginCodeSnippet
typedef LinesListType::LineType LineType;
typedef std::vector<LineType*> LineVectorType;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// And we can now define the pointset type for storing all the
// information related to the detected right angles.
//
// Software Guide : EndLatex
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// And we can now define the pointset type for storing all the
// information related to the detected right angles.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginCodeSnippet
typedef itk::PointSet<LineVectorType, Dimension> PointSetType;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We define the type for the line segment detector. A detailed
// example for this detector can be found in section \ref{sec:LSD}.
//
// Software Guide : EndLatex
// Software Guide : BeginLatex
//
// We define the type for the line segment detector. A detailed
// example for this detector can be found in section \ref{sec:LSD}.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginCodeSnippet
typedef otb::LineSegmentDetector<ImageType , PixelType> LsdFilterType;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We can finally define the type for the right angle detection
// filter. This filter is templated over the input image type, the
// type of the lines provided by the line segment detector, and the
// output pointset type containing the detected right angles.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginLatex
//
// We can finally define the type for the right angle detection
// filter. This filter is templated over the input image type, the
// type of the lines provided by the line segment detector, and the
// output pointset type containing the detected right angles.
//
// Software Guide : EndLatex
typedef itk::MinimumMaximumImageCalculator<ImageType> MinMaxFilterType;
// Software Guide : BeginCodeSnippet
typedef otb::LineSpatialObjectListToRightAnglePointSetFilter<ImageType,
LinesListType, PointSetType>
RightAngleFilterType;
LinesListType, PointSetType>
RightAngleFilterType;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We instantiate the line segment detector and the right angle detector.
//
// Software Guide : EndLatex
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We instantiate the line segment detector and the right angle detector.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginCodeSnippet
LsdFilterType::Pointer lsdFilter = LsdFilterType::New();
RightAngleFilterType::Pointer rightAngleFilter =
RightAngleFilterType::New();
RightAngleFilterType::Pointer rightAngleFilter = RightAngleFilterType::New();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We plug the pipeline. The right angle detector has 2 inputs: the
// image to be processed and the previously detected lines.
//
// Software Guide : EndLatex
// Software Guide : EndCodeSnippet
MinMaxFilterType::Pointer minmaxCalculator = MinMaxFilterType::New();
// Software Guide : BeginLatex
//
// We plug the pipeline. The right angle detector has 2 inputs: the
// image to be processed and the previously detected lines.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginCodeSnippet
lsdFilter->SetInput(reader->GetOutput());
rightAngleFilter->SetInputImage(reader->GetOutput());
rightAngleFilter->SetInput(lsdFilter->GetOutput());
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// You can qualify how far the right angle must the segments be, and the tolerance
// to consider an angle between two segments as an right one.
//
rightAngleFilter->SetThresholdAngle(angleThreshold);
rightAngleFilter->SetThresholdDistance(distanceThreshold);
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
rightAngleFilter->Update();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We will now draw the right angles on top of the inout image. For
// this, we get the output of the right angle detector.
//
// Software Guide : EndLatex
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We will now draw the right angles on top of the inout image. For
// this, we get the output of the right angle detector.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginCodeSnippet
PointSetType::Pointer segmentOrtho = PointSetType::New();
segmentOrtho = rightAngleFilter->GetOutput();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We will iterate through the pointset and get the lines which define
// each right angle stored inside each point of the pointset. The
// lines will be stored into a line list.
//
// Software Guide : EndLatex
// Software Guide : BeginLatex
//
// We will iterate through the pointset and get the lines which define
// each right angle stored inside each point of the pointset. The
// lines will be stored into a line list.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginCodeSnippet
PointSetType::PointType pRight;
LineVectorType outputVectorLines;
LinesListType::Pointer outputLinesList = LinesListType::New();
......@@ -186,54 +207,57 @@ int main( int argc, char * argv[] )
for (unsigned int i = 0; i<segmentOrtho->GetNumberOfPoints(); i++)
{
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Even if we do not use it in this example, we show here how to get
// the coordinates of the right angle.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginLatex
//
// Even if we do not use it in this example, we show here how to get
// the coordinates of the right angle.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
segmentOrtho->GetPoint(i, &pRight);
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// The lines associated to a given angle are obtained using the
// \code{GetPointData} method of the pointset. Then they are stored
// into the list of lines.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginLatex
//
// The lines associated to a given angle are obtained using the
// \code{GetPointData} method of the pointset. Then they are stored
// into the list of lines.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
segmentOrtho->GetPointData(i, &outputVectorLines);
outputLinesList->push_back(outputVectorLines[0]);
outputLinesList->push_back(outputVectorLines[1]);
}
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We will use the \doxygen{otb}{DrawLineSpatialObjectListFilter} to
// draw the list of lines on top of the input image.
//
// Software Guide : EndLatex
// Software Guide : EndCodeSnippet
minmaxCalculator->SetImage(reader->GetOutput());
minmaxCalculator->ComputeMaximum();
// Software Guide : BeginLatex
//
// We will use the \doxygen{otb}{DrawLineSpatialObjectListFilter} to
// draw the list of lines on top of the input image.
// The value assigned to the line is the maximum of the input image.
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
// Software Guide : BeginCodeSnippet
typedef otb::DrawLineSpatialObjectListFilter< ImageType,
ImageType > DrawLineListType;
ImageType > DrawLineListType;
DrawLineListType::Pointer drawLineFilter = DrawLineListType::New();
drawLineFilter->SetInput(reader->GetOutput());
drawLineFilter->SetInputLineSpatialObjectList(outputLinesList);
drawLineFilter->SetValue(minmaxCalculator->GetMaximum());
writer->SetInput(drawLineFilter->GetOutput());
writer->SetFileName(outfname);
reader->GenerateOutputInformation();
writer->Update();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
// Software Guide : BeginLatex
// Figure~\ref{fig:RIGHTANGLE_FILTER} shows the result of applying
// the right angle detection filter to an image.
// \begin{figure}
......
......@@ -29,9 +29,10 @@ void RegisterTests()
REGISTER_TEST(ExtractRoadExampleTest);
REGISTER_TEST(SeamCarvingExampleTest);
REGISTER_TEST(SeamCarvingOtherExampleTest);
//REGISTER_TEST(ImageToSIFTKeyPointSetFilterTest);
//REGISTER_TEST(ImageToSIFTKeyPointSetFilterTest);
REGISTER_TEST(ScaleInvariantFeatureImageFilterTest);
REGISTER_TEST(CloudDetectionExampleTest);
REGISTER_TEST( RightAngleDetectionExample);
}
#undef main
......@@ -62,3 +63,6 @@ void RegisterTests()
#define main CloudDetectionExampleTest
#include "CloudDetectionExample.cxx"
#undef main
#define main RightAngleDetectionExample
#include "RightAngleDetectionExample.cxx"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment