Changeset 86 for foam/trunk/vision
- Timestamp:
- 06/02/2009 11:15:10 AM (12 years ago)
- Location:
- foam/trunk/vision/src
- Files:
-
- 9 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
foam/trunk/vision/src/Image.cpp
r85 r86 24 24 Image::Image(int w, int h, int d, int c) 25 25 { 26 cvCreateImage(cvSize(w, h), d, c);26 m_Image=cvCreateImage(cvSize(w, h), d, c); 27 27 } 28 28 … … 41 41 { 42 42 m_Image=cvCloneImage(other); 43 } 44 45 Image::Image(int w, int h, int c, const Vector<float> &v) 46 { 47 m_Image=cvCreateImage(cvSize(w, h), 8, c); 48 unsigned int pos=0; 49 for(int y=0; y<m_Image->height; y++) 50 { 51 for(int x=0; x<m_Image->width; x++) 52 { 53 CvScalar s; 54 for (int c=0; c<m_Image->nChannels; c++) 55 { 56 s.val[c]=v[pos++]*256.0f; 57 } 58 cvSet2D(m_Image,y,x,s); 59 } 60 } 43 61 } 44 62 … … 148 166 } 149 167 150 voidImage::GRAY2RGB()168 Image Image::GRAY2RGB() 151 169 { 152 170 IplImage *newimage = cvCreateImage(cvGetSize(m_Image), 8, 3); 153 171 cvCvtColor(m_Image, newimage, CV_GRAY2RGB); 154 cvReleaseImage(&m_Image); 155 m_Image=newimage; 156 } 157 158 void Image::RGB2GRAY() 172 return Image(newimage); 173 } 174 175 Image Image::RGB2GRAY() 159 176 { 160 177 IplImage *newimage = cvCreateImage(cvGetSize(m_Image), 8, 1); 161 178 cvCvtColor(m_Image, newimage, CV_RGB2GRAY); 162 cvReleaseImage(&m_Image); 163 m_Image=newimage; 164 } 165 166 void Image::BayerGB2RGB() 179 return Image(newimage); 180 } 181 182 Image Image::BayerGB2RGB() 167 183 { 168 184 IplImage *newimage = cvCreateImage(cvGetSize(m_Image), 8, 3); 169 185 cvCvtColor(m_Image, newimage, CV_BayerGB2RGB); 170 cvReleaseImage(&m_Image); 171 m_Image=newimage; 172 } 173 174 void Image::Scale(int w, int h) 186 return Image(newimage); 187 } 188 189 Image Image::Scale(int w, int h) 175 190 { 176 191 IplImage *newimage = cvCreateImage(cvSize(w,h), m_Image->depth, m_Image->nChannels); 177 192 cvResize( m_Image, newimage, CV_INTER_LINEAR ); 178 cvReleaseImage(&m_Image); 179 m_Image=newimage; 193 return Image(newimage); 180 194 } 181 195 … … 330 344 for(int x=0; x<m_Image->width; x++) 331 345 { 332 333 346 h[(unsigned char)cvGet2D(m_Image,y,x).val[channel]]++; 334 347 } … … 338 351 } 339 352 353 Vector<float> Image::ToFloatVector() 354 { 355 Vector<float> v(m_Image->width*m_Image->height*m_Image->nChannels); 356 // for each pixel 357 unsigned int pos=0; 358 for(int y=0; y<m_Image->height; y++) 359 { 360 for(int x=0; x<m_Image->width; x++) 361 { 362 for (int c=0; c<m_Image->nChannels; c++) 363 { 364 v[pos++]=cvGet2D(m_Image,y,x).val[c]/256.0f; 365 } 366 } 367 } 368 return v; 369 } -
foam/trunk/vision/src/Image.h
r85 r86 16 16 17 17 #include "cv.h" 18 #include "Vector.h" 18 19 #include <string> 19 20 … … 28 29 Image(const Image &other); 29 30 Image(const IplImage *other); // copies the given image 31 Image(int w, int h, int c, const Vector<float> &v); 30 32 ~Image(); 31 33 … … 38 40 39 41 void Crop(int x, int y, int w, int h); 40 voidScale(int w, int h);42 Image Scale(int w, int h); 41 43 42 44 // Paste an image into this one … … 53 55 54 56 // Convert to different colour spaces 55 voidGRAY2RGB();56 voidRGB2GRAY();57 voidBayerGB2RGB();57 Image GRAY2RGB(); 58 Image RGB2GRAY(); 59 Image BayerGB2RGB(); 58 60 59 61 // Calculate a histogram for a given channel 60 62 unsigned int *Hist(int channel); 63 64 Vector<float> ToFloatVector(); 65 unsigned int NumElements() { return m_Image->width*m_Image->height*m_Image->nChannels; } 61 66 62 67 IplImage *m_Image; -
foam/trunk/vision/src/LDAClassifier.h
r85 r86 20 20 #include "Vector.h" 21 21 #include "Matrix.h" 22 #include "Classifier.h" 22 23 23 24 #ifndef FOAM_LDA_CLASSIFIER … … 26 27 // A linear discriminant analysis classifier for arbitrary data sets 27 28 28 template<class T> 29 class LDAClassifier 29 class LDAClassifier : public Classifier 30 30 { 31 31 public: … … 33 33 ~LDAClassifier(); 34 34 35 class Feature 36 { 37 public: 38 Vector<T> m_Data; 39 int m_Class; 40 }; 41 42 void AddFeature(const Feature &f); 43 int Classify(const Feature &f); 35 virtual int Classify(const Vector<float> &f); 44 36 45 37 private: 46 38 47 void CalcClasses(); 48 void CalcGlobalMean(); 49 void CalcClassMeans(); 39 void CalcGroupMeans(); 50 40 void CalcMeanCorrected(); 51 41 void CalcCovariance(); 52 42 void CalcPooledCovariance(); 53 43 void CalcPriorProbablity(); 54 55 unsigned int m_FeatureSize;56 std::vector<Feature > m_Features;57 44 58 std::set<int> m_Classes; 59 Vector<T> m_GlobalMean; 60 std::map<int,Vector<T> > m_ClassMeans; 61 std::map<int,Matrix<T> > m_MeanCorrected; 62 std::map<int,Matrix<T> > m_Covariance; 63 Matrix<T> m_PooledCovariance; 64 Vector<T> m_PriorProbability; 45 std::map<int,Vector<float> > m_GroupMean; 46 std::map<int,Matrix<float> > m_MeanCorrected; 47 std::map<int,Matrix<float> > m_Covariance; 48 //Matrix<T> m_PooledCovariance; 49 //Vector<T> m_PriorProbability; 65 50 66 51 }; 67 52 68 template<class T>69 LDAClassifier<T>::LDAClassifier(unsigned int FeatureSize)70 {71 }72 73 template<class T>74 LDAClassifier<T>::~LDAClassifier()75 {76 }77 78 template<class T>79 void LDAClassifier<T>::AddFeature(const Feature &f)80 {81 m_Features.push_back(f);82 }83 84 template<class T>85 int LDAClassifier<T>::Classify(const Feature &f)86 {87 return 0;88 }89 90 template<class T>91 void LDAClassifier<T>::CalcClasses()92 {93 m_Classes.clear();94 for (typename std::vector<Feature >::iterator i=m_Features.begin();95 i!=m_Features.end(); ++i)96 {97 m_Classes.insert(i->m_Class);98 }99 }100 101 template<class T>102 void LDAClassifier<T>::CalcGlobalMean()103 {104 105 }106 107 template<class T>108 void LDAClassifier<T>::CalcClassMeans()109 {110 }111 112 template<class T>113 void LDAClassifier<T>::CalcMeanCorrected()114 {115 }116 117 template<class T>118 void LDAClassifier<T>::CalcCovariance()119 {120 }121 122 template<class T>123 void LDAClassifier<T>::CalcPooledCovariance()124 {125 }126 127 template<class T>128 void LDAClassifier<T>::CalcPriorProbablity()129 {130 }131 132 53 #endif -
foam/trunk/vision/src/Matrix.h
r85 r86 17 17 #include <assert.h> 18 18 #include <iostream> 19 #include "Vector.h" 19 20 20 21 #ifndef FOAM_MATRIX 21 22 #define FOAM_MATRIX 22 23 23 template<class T> 24 template<class T> 24 25 class Matrix 25 26 { 26 27 public: 28 Matrix(); 27 29 Matrix(unsigned int r, unsigned int c); 28 30 ~Matrix(); 29 31 Matrix(const Matrix &other); 30 32 Matrix(unsigned int r, unsigned int c, float *data); 33 31 34 // Row proxy classes to allow matrix[r][c] notation 32 35 class Row … … 87 90 T *GetRawData() { return m_Data; } 88 91 const T *GetRawDataConst() const { return m_Data; } 92 Vector<T> GetRowVector(unsigned int r) const; 93 Vector<T> GetColVector(unsigned int c) const; 89 94 90 95 void Print() const; 91 96 void SetAll(T s); 97 void Zero() { SetAll(0); } 98 bool IsInf(); 92 99 Matrix Transposed(); 93 100 … … 120 127 121 128 template<class T> 129 Matrix<T>::Matrix() : 130 m_Rows(0), 131 m_Cols(0), 132 m_Data(NULL) 133 { 134 } 135 136 template<class T> 137 Matrix<T>::Matrix(unsigned int r, unsigned int c, float *data) : 138 m_Rows(r), 139 m_Cols(c), 140 m_Data(data) 141 { 142 } 143 144 template<class T> 122 145 Matrix<T>::~Matrix() 123 146 { … … 173 196 } 174 197 } 198 } 199 200 template<class T> 201 bool Matrix<T>::IsInf() 202 { 203 for (unsigned int i=0; i<m_Rows; i++) 204 { 205 for (unsigned int j=0; j<m_Cols; j++) 206 { 207 if (isinf((*this)[i][j])) return true; 208 if (isnan((*this)[i][j])) return true; 209 } 210 } 211 return false; 175 212 } 176 213 … … 266 303 } 267 304 305 template<class T> 306 Vector<T> Matrix<T>::GetRowVector(unsigned int r) const 307 { 308 assert(r<m_Rows); 309 Vector<T> ret(m_Cols); 310 for (unsigned int j=0; j<m_Cols; j++) 311 { 312 ret[j]=(*this)[r][j]; 313 } 314 return ret; 315 } 316 317 template<class T> 318 Vector<T> Matrix<T>::GetColVector(unsigned int c) const 319 { 320 assert(c<m_Cols); 321 Vector<T> ret(m_Rows); 322 for (unsigned int i=0; i<m_Rows; i++) 323 { 324 ret[i]=(*this)[i][c]; 325 } 326 return ret; 327 } 268 328 269 329 template<class T> -
foam/trunk/vision/src/Vector.h
r85 r86 16 16 17 17 #include <assert.h> 18 #include <math.h> 18 19 #include <iostream> 19 20 … … 25 26 { 26 27 public: 28 Vector(); 27 29 Vector(unsigned int s); 28 30 ~Vector(); … … 30 32 31 33 T &operator[](unsigned int i) 34 { 35 assert(i<m_Size); 36 return m_Data[i]; 37 } 38 39 const T &operator[](unsigned int i) const 32 40 { 33 41 assert(i<m_Size); … … 41 49 void Print() const; 42 50 void SetAll(T s); 51 void Zero() { SetAll(0); } 52 bool IsInf(); 43 53 44 54 Vector &operator=(const Vector &other); … … 61 71 62 72 template<class T> 73 Vector<T>::Vector() : 74 m_Size(0) 75 { 76 m_Data=NULL; 77 } 78 79 template<class T> 63 80 Vector<T>::Vector(unsigned int s) : 64 81 m_Size(s) … … 113 130 (*this)[i]=s; 114 131 } 132 } 133 134 template<class T> 135 bool Vector<T>::IsInf() 136 { 137 for (unsigned int i=0; i<m_Size; i++) 138 { 139 if (isinf((*this)[i])) return true; 140 if (isnan((*this)[i])) return true; 141 } 142 return false; 115 143 } 116 144 -
foam/trunk/vision/src/main.cpp
r85 r86 22 22 #include "Matrix.h" 23 23 #include "Vector.h" 24 #include " LDAClassifier.h"24 #include "PCA.h" 25 25 26 26 using namespace std; … … 32 32 double scale = 1; 33 33 34 PCA pca(Image("data/a-id0001-image0000.png").RGB2GRAY().NumElements()); 35 int tw=Image("data/a-id0001-image0000.png").RGB2GRAY().m_Image->width; 36 int th=Image("data/a-id0001-image0000.png").RGB2GRAY().m_Image->height; 37 int tc=Image("data/a-id0001-image0000.png").RGB2GRAY().m_Image->nChannels; 38 39 void TestPCA() 40 { 41 pca.AddFeature(Image("data/a-id0001-image0000.png").RGB2GRAY().ToFloatVector()); 42 pca.AddFeature(Image("data/a-id0001-image0001.png").RGB2GRAY().ToFloatVector()); 43 pca.AddFeature(Image("data/a-id0002-image0000.png").RGB2GRAY().ToFloatVector()); 44 pca.AddFeature(Image("data/a-id0002-image0001.png").RGB2GRAY().ToFloatVector()); 45 cerr<<"pre calc"<<endl; 46 pca.Calculate(); 47 cerr<<"post calc"<<endl; 48 } 49 50 34 51 int main( int argc, char** argv ) 35 52 { 53 54 PCA::RunTests(); 55 TestPCA(); 56 36 57 CvCapture* capture = 0; 37 58 IplImage *frame, *frame_copy = 0; … … 190 211 ////////////////////////////////// 191 212 // image differencing 192 213 /* 193 214 vector<Image> imagevec; 194 215 //imagevec.push_back(Image("data/audrey.png")); … … 233 254 //camera.Blit(dave2,140,100); 234 255 //camera.Blit(other,180,100); 235 236 237 238 cvShowImage("result", camera.m_Image); 256 */ 257 258 /////////////////////////////////// 259 // PCA display 260 261 for (int i=0; i<10; i++) 262 { 263 camera.Blit(Image(tw,th,tc,pca.GetEigenTransform().GetRowVector(i)),i*50,100); 264 } 265 266 cvShowImage("result", camera.m_Image); 239 267 240 268 }
Note: See TracChangeset
for help on using the changeset viewer.