00001
00002 #ifndef _GT2005CenterCircleFinder_h_
00003 #define _GT2005CenterCircleFinder_h_
00004
00005 #include "Tools/Math/Vector2.h"
00006 #include "Representations/Perception/Image.h"
00007 #include "Tools/Math/Geometry.h"
00008 #include "Representations/Perception/CameraMatrix.h"
00009 #include "GT2005ImageProcessorTools.h"
00010
00011 class GT2005CenterCircleFinder
00012 {
00013 public:
00014 enum{
00015 maxNumberOfCandidatesPossible = 90,
00016 houghDimensionX = 100,
00017 houghDimensionY = 50,
00018 radius = 180,
00019 areaOfInterestX = 3000,
00020 areaOfInterestY = 2000,
00021 mEntry = 4,
00022 mEntry2 = 15,
00023 mEntry3 = 11,
00024 scanLength = 140,
00025 minNumberOfPositives = 7,
00026 minNumberOfPositivesForDistanceCheck = 4,
00027 enoughPros = 45,
00028 maximalDistanceAllowedBetweenMidAndBorder = 290,
00029 maxNumberOfCandidatesMaxEntry = 150,
00030 acceptedAvgDistance = 200,
00031 onlyWhiteAllowed = 2,
00032 numberOfScanLines = 8,
00033 neededWhiteCount = 2
00034 };
00035
00036
00037
00038 GT2005CenterCircleFinder(const ColorCorrector& colorCorrector, const ColorTable& cTable);
00039
00040
00041 void reset();
00042
00043
00044 void addCandidate(Vector2<int>& candiOnField, Vector2<int>& candiOfImage);
00045
00046
00047 void determineCirclePoint(const CameraMatrix& cameraMatrix, const Image& image, const RobotPose& robotPose, const CameraMatrix& prevCameraMatrix);
00048
00049 bool circleFound;
00050
00051 bool getCircle(Vector2<double>& mid);
00052
00053
00054 bool circle(Vector2<double>& mid)
00055 {
00056 if(circleFound)
00057 mid = midPoint;
00058 return(circleFound);
00059 }
00060
00061
00062
00063
00064 private:
00065 struct Candidate
00066 {
00067 Vector2<double> pointOnField;
00068 Vector2<int> pointOfImage;
00069 };
00070 struct multipleCandidate
00071 {
00072 Vector2<double> pointOnField;
00073 int count;
00074 double avgDistance;
00075 };
00076
00077 Vector2<double> midPoint;
00078
00079
00080 Candidate candidatePoints[maxNumberOfCandidatesPossible];
00081
00082
00083 int numberOfCandidates;
00084
00085
00086
00087 int houghSpace[houghDimensionX][houghDimensionY];
00088
00089
00090
00091 bool flagY[houghDimensionY];
00092
00093
00094 int houghStepX;
00095 int houghStepY;
00096
00097
00098
00099 double maxQuantizationErrorX;
00100 double maxQuantizationErrorY;
00101
00102
00103 int timeTillLastSeen;
00104 Vector2<double> midPointLastSeenField;
00105 Vector2<int> midPointLastSeenFieldInt;
00106
00107 double lineThicknessRateAllowed;
00108
00109
00110
00111
00112
00113 void transformArrayToField(int arrayIndex, bool xDirection, int& fieldPosition);
00114
00115
00116
00117
00118 void transformFieldToArray(double fieldPos, bool xDirection, int& arrayIndex);
00119
00120
00121 void checkCircleMidpoint(Vector2<double> candidate, int absMaxEntry, const CameraMatrix& cameraMatrix, const Image& image, const RobotPose& robotPose, const CameraMatrix& prevCameraMatrix);
00122
00123
00124 void checkCircleMidpoint2(int maxEntry, int NumberOfEntriesMaxEntry, multipleCandidate maxEntryFieldCoord[maxNumberOfCandidatesMaxEntry], const CameraMatrix& cameraMatrix,const Image& image, const RobotPose& robotPose, const CameraMatrix& prevCameraMatrix);
00125
00126 bool scanSurrounding(Vector2<int> start, Vector2<double> startOnField, const CameraMatrix& cameraMatrix, const Image& image, const RobotPose& robotPose, const CameraMatrix& prevCameraMatrix);
00127
00128 void scan(Vector2<int> start, Vector2<double> startOnField, Vector2<int> end, Vector2<int> step, int& positiveInNumberOfDirection, const CameraMatrix& cameraMatrix, const Image& image, const RobotPose& robotPose, const CameraMatrix& prevCameraMatrix,double& distance, bool& positiv);
00129
00130
00131
00132 const ColorCorrector& colorCorrector;
00133 const ColorTable& colorTable;
00134
00135
00136
00137 };
00138
00139
00140 #endif //_GT2005CenterCircleFinder_h_
00141
00142
00143
00144