icub-basic-demos
pf3dTrackerSupport.cpp
1 
14 #include <iostream>
15 #include <iCub/pf3dTrackerSupport.hpp>
16 
17 using namespace std;
18 
19 void rgbToYuvBin(int &R, int &G, int &B, int &YBin, int &UBin, int &VBin)
20 {
21  //I copied the transformation from the wikipedia. WARNING ??? !!!
22  float Y, U, V;
23  Y= 0.299F *(float)R +0.587F * (float)G + 0.114F *(float)B;
24  U= -0.147F*float(R) -0.289F*float(G) +0.436F*float(B); //-255*436<U<255*436
25  U+=0.436F*255.0F; //0<U<255*2*0.436
26  U=U/(2.0F*0.436F);//0<U<255
27  V= ((0.615F*float(R) -0.515F*float(G)+0.100F*float(B)+0.615F*255.0F)/(2.0F*0.615F+0.1F));
28 
29  YBin=(int)Y/ 64; //I want Y to vary between 0 and 3.
30  UBin=(int)U/ 32; //I want U to vary between 0 and 7.
31  VBin=(int)V/ 32; //I want V to vary between 0 and 7.
32 
33  if(YBin<0||YBin>3)
34  yWarning()<<"something's wrong with Y: "<<YBin<<" "<<Y;
35  if(UBin<0||UBin>7)
36  yWarning()<<"something's wrong with U: "<<UBin<<" "<<U;
37  if(VBin<0||VBin>7)
38  yWarning()<<"something's wrong with V: "<<VBin<<" "<<V<<" R= "<<R<<" G= "<<G<<" B= "<<B;
39 }
40 
41 void rgbToYuvBinImage(IplImage *image,IplImage* transformedImage)
42 {
43  int a1,a2,r,g,b, s,t,u;
44  for(a1=0;a1<transformedImage->width;a1++)
45  for(a2=0;a2<transformedImage->height;a2++)
46  {
47  r=(((uchar*)(image->imageData + image->widthStep*a2))[a1*3+0]);
48  g=(((uchar*)(image->imageData + image->widthStep*a2))[a1*3+1]);
49  b=(((uchar*)(image->imageData + image->widthStep*a2))[a1*3+2]);
50  rgbToYuvBin(r,g,b, s,t,u);
51  (((uchar*)(transformedImage->imageData + transformedImage->widthStep*a2))[a1*3+0])=s;
52  (((uchar*)(transformedImage->imageData + transformedImage->widthStep*a2))[a1*3+1])=t;
53  (((uchar*)(transformedImage->imageData + transformedImage->widthStep*a2))[a1*3+2])=u;
54  //yuvBinsImage[a1][a2][0], yuvBinsImage[a1][a2][1], yuvBinsImage[a1][a2][2]);
55  }
56 }
57 
58 void setPixel(int u, int v, int r, int g, int b, IplImage *image)
59 {
60  //std::cout<<"u= "<<u<<" v= "<<v<<std::endl;
61  if(u>-1&&u<image->width && v>-1&&v<image->height)
62  {
63  (((uchar*)(image->imageData + image->widthStep*v))[u*3+0])=r;
64  (((uchar*)(image->imageData + image->widthStep*v))[u*3+1])=g;
65  (((uchar*)(image->imageData + image->widthStep*v))[u*3+2])=b;
66  }
67 }
68 
69 void fillLut(Lut *lut)
70 {
71  int r,g,b, y,u,v;
72  int index;
73  for(r=0;r<256;r++)
74  for(g=0;g<256;g++)
75  for(b=0;b<256;b++)
76  {
77  rgbToYuvBin(r,g,b, y,u,v);
78  index=r*65536+g*256+b;
79  lut[index].y=y;
80  lut[index].u=u;
81  lut[index].v=v;
82  }
83 }
84 
85 void rgbToYuvBinMatLut(const cv::Mat& image, cv::Mat& transformedImage, Lut *lut)
86 {
87  int a1,a2,r,g,b;
88  int index;
89 
90  for(a1=0;a1<image.cols;a1++)
91  for(a2=0;a2<image.rows;a2++)
92  {
93  r=(((uchar*)(image.data + image.step*a2))[a1*3+0]);
94  g=(((uchar*)(image.data + image.step*a2))[a1*3+1]);
95  b=(((uchar*)(image.data + image.step*a2))[a1*3+2]);
96  index=r*65536+g*256+b;
97  (((uchar*)(transformedImage.data + transformedImage.step*a2))[a1*3+0])=lut[index].y;
98  (((uchar*)(transformedImage.data + transformedImage.step*a2))[a1*3+1])=lut[index].u;
99  (((uchar*)(transformedImage.data + transformedImage.step*a2))[a1*3+2])=lut[index].v;
100  //rgbToYuvBin(r,g,b, yuvBinsImage[a1][a2][0], yuvBinsImage[a1][a2][1], yuvBinsImage[a1][a2][2]);
101  }
102 
103 }
104 
105 void rgbToYuvBinImageLut(IplImage *image,IplImage *transformedImage, Lut *lut)
106 {
107  int a1,a2,r,g,b;
108  int index;
109 
110  for(a1=0;a1<image->width;a1++)
111  for(a2=0;a2<image->height;a2++)
112  {
113  r=(((uchar*)(image->imageData + image->widthStep*a2))[a1*3+0]);
114  g=(((uchar*)(image->imageData + image->widthStep*a2))[a1*3+1]);
115  b=(((uchar*)(image->imageData + image->widthStep*a2))[a1*3+2]);
116  index=r*65536+g*256+b;
117  (((uchar*)(transformedImage->imageData + transformedImage->widthStep*a2))[a1*3+0])=lut[index].y;
118  (((uchar*)(transformedImage->imageData + transformedImage->widthStep*a2))[a1*3+1])=lut[index].u;
119  (((uchar*)(transformedImage->imageData + transformedImage->widthStep*a2))[a1*3+2])=lut[index].v;
120  //rgbToYuvBin(r,g,b, yuvBinsImage[a1][a2][0], yuvBinsImage[a1][a2][1], yuvBinsImage[a1][a2][2]);
121  }
122 
123 }
124 
125 void rgbToYuvBinLut(int &R, int &G, int &B, int &YBin, int &UBin, int &VBin, Lut *lut)
126 {
127  //I copied the transformation from the wikipedia. WARNING ??? !!!
128  float Y, U, V;
129  Y= 0.299F *(float)R +0.587F * (float)G + 0.114F *(float)B;
130  U= -0.147F*float(R) -0.289F*float(G) +0.436F*float(B); //-255*436<U<255*436
131  U+=0.436F*255.0F; //0<U<255*2*0.436
132  U=U/(2.0F*0.436F);//0<U<255
133  V= ((0.615F*float(R) -0.515F*float(G)+0.100F*float(B)+0.615F*255.0F)/(2.0F*0.615F+0.1F));
134 
135  YBin=(int)Y/ 64; //I want Y to vary between 0 and 3.
136  UBin=(int)U/ 32; //I want U to vary between 0 and 7.
137  VBin=(int)V/ 32; //I want V to vary between 0 and 7.
138 
139  if(YBin<0||YBin>3)
140  yWarning()<<"something's wrong with Y: "<<YBin<<" "<<Y;
141  if(UBin<0||UBin>7)
142  yWarning()<<"something's wrong with U: "<<UBin<<" "<<U;
143  if(VBin<0||VBin>7)
144  yWarning()<<"something's wrong with V: "<<VBin<<" "<<V<<" R= "<<R<<" G= "<<G<<" B= "<<B;
145 }
Copyright: (C) 2009 RobotCub Consortium Authors: Matteo Taiana, Ugo Pattacini CopyPolicy: Released un...