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