00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef SlamBeaconDetector_h_
00011 #define SlamBeaconDetector_h_
00012
00013 #include "Tools/Math/Vector2.h"
00014 #include "Tools/Math/Matrix2x2.h"
00015 #include "SlamFlagSpecialist.h"
00016 #include "Modules/ImageProcessor/ImageProcessorTools/ImageProcessorUtilityClasses.h"
00017 #include "Modules/ImageProcessor/ImageProcessorTools/SUSANEdgeDetectionLite.h"
00018 #include "Modules/ImageProcessor/ImageProcessorTools/BresenhamLineScan.h"
00019 #include "Tools/ColorClasses.h"
00020
00021 #include "Representations/Perception/SpecialPercept.h"
00022 #include "SlamFlagLocator.h"
00023
00024 #define NUM_SECTORS 64
00025 #define NUM_SPECIAL_FLAGS 256
00026
00027 #define MAX_NUMBER_OF_PINK_RUNS 20
00028
00029 struct SpecialFlag
00030 {
00031 colorClass sectors[NUM_SECTORS];
00032 double direction;
00033 int directionCount;
00034
00035 Vector2<int> position;
00036
00037 int index;
00038 };
00039
00040
00041
00042
00043
00044
00045 class SlamBeaconDetector
00046 {
00047 public:
00048
00049 enum {edgeThresholdU = 13, edgeThresholdV = 15};
00050
00051
00052 SlamBeaconDetector(const Image& image, const CameraMatrix& cameraMatrix,
00053 const CameraMatrix& prevCameraMatrix,
00054 const ImageInfo& imageInf,
00055 const ColorTable& colorTable,
00056 const ColorCorrector& colorCorrector,
00057 const RobotPose& robotPose,
00058 LandmarksPercept& landmarksPercept,
00059 SpecialPercept& specialPercept);
00060
00061
00062 void execute();
00063
00064
00065 void analyzeColorTable();
00066
00067 double direction;
00068 int directionCount;
00069
00070 private:
00071 int frameCount;
00072
00073 int numFlags;
00074 SpecialFlag specialFlags[NUM_SPECIAL_FLAGS];
00075
00076
00077 const SUSANEdgeDetectionLite edgeDetectionU;
00078 const SUSANEdgeDetectionLite edgeDetectionV;
00079
00080
00081 const Image& image;
00082
00083 const CameraMatrix& cameraMatrix;
00084
00085 const CameraMatrix& prevCameraMatrix;
00086
00087 const ImageInfo& imageInf;
00088
00089 const ColorTable& colorTable;
00090
00091 const RobotPose& robotPose;
00092
00093
00094 LandmarksPercept& landmarksPercept;
00095
00096 SpecialPercept& specialPercept;
00097
00098 int numOfBeaconCandidates;
00099
00100 int numOfClusteredBeaconCandidates;
00101
00102 Run beaconCandidates[MAX_NUMBER_OF_PINK_RUNS];
00103
00104 TransformedRun transformedCandidates[MAX_NUMBER_OF_PINK_RUNS];
00105
00106 const double horizontalBaseOffset;
00107
00108 const int numOfHorizontalScanLineAbove;
00109
00110 const int numOfHorizontalScanLineBelow;
00111
00112 const double horizontalOffsetModifier;
00113
00114 const int clusteringDistanceTolerance;
00115
00116 const int minPinkRunLength;
00117
00118
00119 const double clusteringAspectRatio;
00120
00121
00122 const double projectionAspectRatio;
00123
00124
00125 const int edgeScanDepth;
00126
00127 unsigned char minPinkUValue;
00128
00129
00130 const double minFlagConfidence;
00131
00132 SlamFlagSpecialist flagSpecialist;
00133
00134 const ColorCorrector& colorCorrector;
00135
00136 double FindSimilarFlag(SpecialFlag &);
00137
00138
00139
00140
00141
00142 bool addCandidate(const Run& pinkRun);
00143
00144
00145 void scanForPink(const Vector2<int>& start, const Vector2<int>& end);
00146
00147
00148 bool scanForBeaconPart(const Vector2<int>& start, const Vector2<int>& end,
00149 Vector2<int>& position, Vector2<int>& edge, colorClass& color);
00150
00151
00152 void clusterPinkBeaconParts();
00153
00154
00155 void findSpecial(const Vector2<int>& center, const double pinkRunWidth);
00156
00157
00158 void characterizeNewFlag(const Vector2<int>& center);
00159
00160
00161 SlamFlagLocator::flagCharacteristics scanForFlagCharacterization(const Vector2<int>& start, const Vector2<double>& direction);
00162
00163
00164 void analyzeBeacon(const Vector2<double>& left, const Vector2<int>& center, const double pinkRunWidth);
00165
00166
00167 int scanForBeaconEdges(const Vector2<int>& position, const double pinkRunWidth,
00168 Flag::FlagType& flagType, Vector2<int>& topEdge, Vector2<int>& bottomEdge);
00169
00170 enum {lowReliability = 1, mediumReliability = 4, highReliability = 6};
00171 };
00172
00173 #endif //SlamBeaconDetector_h_