00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __ColorCorrector_h_
00014 #define __ColorCorrector_h_
00015
00016 #include "Representations/Perception/Image.h"
00017 #include "Platform/GTAssert.h"
00018
00019 #define MSH
00020
00021
00022
00023
00024
00025 class ColorCorrector
00026 {
00027 private:
00028 enum {maxRadius = 140, centerRadius = 10};
00029 unsigned char radiusTable[cameraResolutionHeight_ERS7][cameraResolutionWidth_ERS7];
00030 static unsigned char correctionTable[maxRadius + 1][256][3];
00031
00032 #ifdef MSH
00033 enum {maxRadialOrder = 10, maxColorOrder = 10};
00034 static int radialOrder;
00035 static int colorOrder;
00036 static double radialP[3 * maxRadialOrder];
00037 static double colorP[3 * maxColorOrder];
00038
00039 static unsigned char colorDistortionCorrection(const unsigned char radius_i, const unsigned char color,
00040 const unsigned char channel);
00041 #endif
00042
00043 #ifdef _WIN32
00044 static unsigned char distortionTable[maxRadius + 1][256][3];
00045 #endif
00046 static bool loaded;
00047
00048
00049
00050
00051
00052
00053
00054 static unsigned char calcRadius(int x, int y)
00055 {
00056 int r = (int) (Vector2<double>(x - cameraResolutionWidth_ERS7 / 2,
00057 y - cameraResolutionHeight_ERS7 / 2).abs() - centerRadius);
00058 if(r < 0)
00059 r = 0;
00060 return (unsigned char) r;
00061 }
00062
00063 public:
00064
00065
00066
00067 ColorCorrector() {load();}
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 inline unsigned char correct(const int x, const int y,
00078 const int c, const unsigned char intensity) const
00079 {
00080
00081 if ((x >= 0) && (y >= 0))
00082 return correctionTable[radiusTable[y][x]][intensity][c];
00083 else
00084 return 0;
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 inline void correct(const int x, const int y,
00096 unsigned char& intensityY,
00097 unsigned char& intensityU,
00098 unsigned char& intensityV) const
00099 {
00100 int radius = radiusTable[y][x];
00101 intensityY = correctionTable[radius][intensityY][0];
00102 intensityU = correctionTable[radius][intensityU][1];
00103 intensityV = correctionTable[radius][intensityV][2];
00104 }
00105
00106
00107
00108
00109
00110 void correct(Image& image) const;
00111
00112 #ifdef _WIN32
00113
00114
00115
00116
00117
00118
00119
00120
00121 void distort(const int x, const int y,
00122 unsigned char& intensityY,
00123 unsigned char& intensityU,
00124 unsigned char& intensityV) const
00125 {
00126 int radius = radiusTable[y][x];
00127 intensityY = distortionTable[radius][intensityY][0];
00128 intensityU = distortionTable[radius][intensityU][1];
00129 intensityV = distortionTable[radius][intensityV][2];
00130 }
00131
00132
00133
00134
00135
00136 void distort(Image& image) const;
00137
00138 #endif
00139
00140 private:
00141
00142
00143
00144 void load();
00145
00146
00147
00148
00149
00150 void disable();
00151 };
00152
00153 #endif// __ColorCorrector_h_