00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <sensor_msgs/image_encodings.h>
00031 namespace enc = sensor_msgs::image_encodings;
00032
00033 namespace rgbd_assembler {
00034
00035 void transformRGB(float val, float &r, float &g, float &b){
00036 union{int intp; float floatp; } a;
00037 a.floatp = val;
00038 int rgb = *reinterpret_cast<int*>(&a.intp);
00039
00040 r = ((rgb >> 16) & 0xff) / 255.0f;
00041 g = ((rgb >> 8) & 0xff) / 255.0f;
00042 b = (rgb & 0xff) / 255.0f;
00043 }
00044
00045 float getRGB( float r, float g, float b){
00046 union{ int intp; float floatp; } a;
00047 int res = (int(r*255) << 16) | (int(g*255) << 8) | int(b*255);
00048 a.intp=res;
00049 float rgb = *(&a.floatp);
00050 return rgb;
00051 }
00052
00053
00054 enum Format { INVALID = -1, GRAY = 0, RGB, BGR, RGBA, BGRA };
00055
00056 Format getFormat(const std::string& encoding)
00057 {
00058 if (encoding == enc::BGR8) return BGR;
00059 if (encoding == enc::MONO8) return GRAY;
00060 if (encoding == enc::RGB8) return RGB;
00061 if (encoding == enc::MONO16) return GRAY;
00062 if (encoding == enc::BGRA8) return BGRA;
00063 if (encoding == enc::RGBA8) return RGBA;
00064
00065
00066 return INVALID;
00067 }
00068
00069 void RGBToHSV(float r, float g, float b,
00070 float &h, float &s, float &v)
00071 {
00072
00073 float maxC = b;
00074 if (maxC < g) maxC = g;
00075 if (maxC < r) maxC = r;
00076 float minC = b;
00077 if (minC > g) minC = g;
00078 if (minC > r) minC = r;
00079
00080 float delta = maxC - minC;
00081
00082 v = maxC;
00083 s = 0;
00084 h = 0;
00085
00086 if (delta == 0) {
00087 return;
00088 } else {
00089 s = delta / maxC;
00090 float dR = 60*(maxC - r)/delta + 180;
00091 float dG = 60*(maxC - g)/delta + 180;
00092 float dB = 60*(maxC - b)/delta + 180;
00093 if (r == maxC)
00094 h = dB - dG;
00095 else if (g == maxC)
00096 h = 120 + dR - dB;
00097 else
00098 h = 240 + dG - dR;
00099 }
00100
00101 if (h<0)
00102 h+=360;
00103 if (h>=360)
00104 h-=360;
00105 }
00106
00107 void HSVToRGB(float h, float s, float v,
00108 float &r, float &g, float &b)
00109 {
00110 if(s==0){
00111 r = v;
00112 g = v;
00113 b = v;
00114 return;
00115 }
00116
00117
00118 float h_tmp = h/60.0f;
00119 int i = floor(h_tmp);
00120 float f = h_tmp - i;
00121
00122 float p = v * (1-s);
00123 float q = v * (1-s*f);
00124 float t = v * (1-s * (1-f));
00125
00126
00127 switch(i){
00128 case 0:
00129
00130 r = v;
00131 g = t;
00132 b = p;
00133 break;
00134 case 1:
00135
00136 r = q;
00137 g = v;
00138 b = p;
00139 break;
00140 case 2:
00141
00142 r = p;
00143 g = v;
00144 b = t;
00145 break;
00146 case 3:
00147
00148 r = p;
00149 g = q;
00150 b = v;
00151 break;
00152 case 4:
00153
00154 r = t;
00155 g = p;
00156 b = v;
00157 break;
00158 case 5:
00159
00160 r = v;
00161 g = p;
00162 b = q;
00163 break;
00164 }
00165 }
00166
00167 }