00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __GoalRecognizer_h_
00010 #define __GoalRecognizer_h_
00011
00012 #include "Representations/Perception/Image.h"
00013 #include "Representations/Perception/CameraMatrix.h"
00014 #include "Representations/Perception/ColorTable.h"
00015 #include "Representations/Perception/ObstaclesPercept.h"
00016 #include "Representations/Perception/LandmarksPercept.h"
00017
00018
00019 #include "Tools/Math/Geometry.h"
00020 #include "Tools/Debugging/DebugImages.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 class GoalRecognizer
00034 {
00035 public:
00036 GoalRecognizer(
00037 const Image& image,
00038 const CameraMatrix& cameraMatrix,
00039 const ColorTable& colorTable,
00040 ObstaclesPercept& obstaclesPercept,
00041 LandmarksPercept& landmarksPercept
00042 );
00043
00044 GoalRecognizer(
00045 const Image& image,
00046 const CameraMatrix& cameraMatrix,
00047 const ColorTable& colorTable,
00048 int goalIndicationAboveHorizon,
00049 int goalIndicationBelowHorizon,
00050 ObstaclesPercept& obstaclesPercept,
00051 LandmarksPercept& landmarksPercept
00052 );
00053
00054 ~GoalRecognizer();
00055
00056 void getGoalPercept(LandmarksPercept& landmarksPercept);
00057
00058 struct ColoredPartsCheck
00059 {
00060 Vector2<int> firstPoint;
00061 Vector2<int> lastPoint;
00062 int rangeOfColor;
00063 int numberOfColoredPixels;
00064
00065 enum{maxNumberOfParts = 20};
00066
00067 int numberOfLargeParts;
00068 int sizeOfLargePart[maxNumberOfParts];
00069 Vector2<int> largePartBegin[maxNumberOfParts];
00070 Vector2<int> largePartEnd[maxNumberOfParts];
00071 Vector2<double> largePartBeginAngles[maxNumberOfParts];
00072 Vector2<double> largePartEndAngles[maxNumberOfParts];
00073 bool largePartBeginIsOnBorder[maxNumberOfParts];
00074 bool largePartEndIsOnBorder[maxNumberOfParts];
00075
00076 ColoredPartsCheck()
00077 {
00078 numberOfLargeParts = 0;
00079 }
00080
00081 bool determineLargePart(int size, bool beginIsOnBorder, bool endIsOnBorder, CameraMatrix cameraMatrix, CameraInfo cameraInfo)
00082 {
00083 bool foundLargePart = false;
00084
00085 {
00086 if(rangeOfColor > size)
00087 {
00088 sizeOfLargePart[numberOfLargeParts] = rangeOfColor;
00089 largePartBegin[numberOfLargeParts].x = firstPoint.x;
00090 largePartBegin[numberOfLargeParts].y = firstPoint.y;
00091 largePartEnd[numberOfLargeParts].x = lastPoint.x;
00092 largePartEnd[numberOfLargeParts].y = lastPoint.y;
00093 largePartBeginIsOnBorder[numberOfLargeParts] = beginIsOnBorder;
00094 largePartEndIsOnBorder[numberOfLargeParts] = endIsOnBorder;
00095
00096 Vector2<double> minAngles, maxAngles;
00097 Geometry::calculateAnglesForPoint(largePartBegin[numberOfLargeParts], cameraMatrix, cameraInfo, largePartBeginAngles[numberOfLargeParts]);
00098 Geometry::calculateAnglesForPoint(largePartEnd[numberOfLargeParts], cameraMatrix, cameraInfo, largePartEndAngles[numberOfLargeParts]);
00099
00100 numberOfLargeParts++;
00101 foundLargePart = true;
00102 LINE(imageProcessor_flagsAndGoals, firstPoint.x, firstPoint.y, lastPoint.x, lastPoint.y,
00103 2, Drawings::ps_solid, Drawings::pink);
00104 }
00105
00106 if(numberOfLargeParts >= maxNumberOfParts)
00107 {
00108 numberOfLargeParts = maxNumberOfParts-1;
00109 }
00110 }
00111 return foundLargePart;
00112 }
00113 };
00114
00115 private:
00116
00117
00118 void calculateScanLinesParallelToHorizon();
00119
00120
00121 void calculateScanLinesParallelToHorizon(
00122 int distanceAboveHorizon,
00123 int distanceBelowHorizon,
00124 int numberOfScanLines
00125 );
00126
00127
00128 void scanHorizontalForGoals();
00129
00130
00131 void calculateVerticalGoalScanLines();
00132
00133
00134 void scanLinesForGoals();
00135
00136 DECLARE_DEBUG_IMAGE(imageProcessorGoals);
00137
00138
00139 const Image& image;
00140
00141
00142 const CameraMatrix& cameraMatrix;
00143
00144
00145 const ColorTable& colorTable;
00146
00147 int goalIndicationAboveHorizon;
00148 int goalIndicationBelowHorizon;
00149 bool useFixedScanLines;
00150
00151
00152 ObstaclesPercept& obstaclesPercept;
00153
00154
00155 LandmarksPercept& landmarksPercept;
00156
00157
00158 colorClass colorOfOpponentGoal;
00159
00160
00161 colorClass colorOfOwnGoal;
00162
00163
00164 Geometry::Line horizonLine, verticalLine;
00165
00166
00167 int numberOfHorizontalScanLines;
00168
00169 enum{maxNumberOfHorizontalScanLines = 32};
00170 enum{maxNumberOfGoalScanLines = 255};
00171
00172
00173 Vector2<int> leftPoint[maxNumberOfHorizontalScanLines];
00174
00175
00176 Vector2<int> rightPoint[maxNumberOfHorizontalScanLines];
00177
00178
00179 int numberOfGoalIndications;
00180
00181
00182 Vector2<int> goalIndicationLeft[maxNumberOfGoalScanLines];
00183
00184
00185 Vector2<int> goalIndicationCenter[maxNumberOfGoalScanLines];
00186
00187
00188 Vector2<int> goalIndicationRight[maxNumberOfGoalScanLines];
00189
00190
00191 bool leftOfGoalIndicationIsOnBorder[maxNumberOfGoalScanLines];
00192
00193
00194 bool rightOfGoalIndicationIsOnBorder[maxNumberOfGoalScanLines];
00195
00196
00197 colorClass colorOfGoalIndication[maxNumberOfGoalScanLines];
00198
00199
00200 int numberOfGoalScanLines;
00201
00202
00203 Vector2<int> topGoalPoint[maxNumberOfGoalScanLines];
00204
00205
00206 Vector2<int> bottomGoalPoint[maxNumberOfGoalScanLines];
00207
00208 bool scanLineToCheckBestAngle[maxNumberOfGoalScanLines];
00209
00210
00211 int indexOfGoalIndication[maxNumberOfGoalScanLines];
00212
00213
00214 colorClass colorOfGoalScanLine[maxNumberOfGoalScanLines];
00215
00216 };
00217
00218 #endif