HMaxObjRecBrain.C
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
00031
00032
00033
00034
00035
00036
00037
00038 #include "Image/Image.H"
00039 #include "Image/ColorOps.H"
00040 #include "Image/Pixels.H"
00041 #include "Image/CutPaste.H"
00042 #include "Image/ShapeOps.H"
00043 #include "Image/Rectangle.H"
00044 #include "Image/MathOps.H"
00045 #include "Image/MatrixOps.H"
00046 #include "Image/Transforms.H"
00047 #include "Image/Convolutions.H"
00048 #include "nub/ref.h"
00049 #include "Util/Types.H"
00050 #include "Util/MathFunctions.H"
00051 #include "Util/log.H"
00052 #include "TestSuite/ObjRecBrain.h"
00053
00054
00055 #include <stdio.h>
00056 #include <vector>
00057 #include <string>
00058 #include <limits>
00059
00060 struct ObjectDBData
00061 {
00062 char name[255];
00063 PixRGB<float> meanRGB;
00064
00065 };
00066
00067 struct ObjectRecData
00068 {
00069 std::string name;
00070 PixRGB<float> meanRGB;
00071 };
00072
00073 float distanceSq(PixRGB<float>& c1, PixRGB<float>& c2)
00074 {
00075 return (squareOf((c1[0] - c2[0])) +
00076 squareOf((c1[1] - c2[1])) +
00077 squareOf((c1[2] - c2[2])));
00078 }
00079
00080
00081 class ColorBrain : public ObjRecBrain
00082 {
00083
00084 public:
00085 ColorBrain(std::string dbFile) :
00086 itsObjectsDBFile(dbFile)
00087 {
00088 }
00089
00090 ~ColorBrain()
00091 {
00092 }
00093
00094 void preTraining()
00095 {
00096 itsFP = fopen(itsObjectsDBFile.c_str(), "wb");
00097 if (itsFP == NULL)
00098 LFATAL("Error loading data file");
00099 }
00100
00101 void onTraining(Image<PixRGB<byte> > &img, ObjectData& objData)
00102 {
00103 ObjectDBData obj;
00104 strcpy(obj.name, objData.name.c_str());
00105
00106 obj.meanRGB = meanRGB(img);
00107
00108
00109 fwrite(&obj, 1, sizeof(ObjectDBData), itsFP);
00110
00111 };
00112 void postTraining()
00113 {
00114 fclose(itsFP);
00115 }
00116
00117
00118 void preRecognition()
00119 {
00120 itsFP = fopen(itsObjectsDBFile.c_str(), "r");
00121 if (itsFP == NULL)
00122 LFATAL("Error loading data file");
00123
00124 itsObjects.clear();
00125 ObjectDBData obj;
00126 while( fread(&obj, 1, sizeof(ObjectDBData), itsFP) > 0)
00127 {
00128 ObjectRecData objData;
00129 objData.name = obj.name;
00130 objData.meanRGB = obj.meanRGB;
00131 itsObjects.push_back(objData);
00132 }
00133 fclose(itsFP);
00134 }
00135
00136 ObjectData onRecognition(Image<PixRGB<byte> > &img)
00137 {
00138
00139 ObjectData obj;
00140 if (itsObjects.size() > 0)
00141 {
00142 PixRGB<float> fv = meanRGB(img);
00143
00144
00145
00146
00147 std::string firstObj = itsObjects[0].name;
00148 float minDist1 = distanceSq(itsObjects[0].meanRGB, fv);
00149 for(uint i=1; i<itsObjects.size(); i++)
00150 {
00151 float dist = distanceSq(itsObjects[i].meanRGB, fv);
00152 if (dist < minDist1)
00153 {
00154 minDist1 = dist;
00155 firstObj = itsObjects[i].name;
00156 }
00157 }
00158
00159
00160 std::string secondObj;
00161 float minDist2 = std::numeric_limits<float>::max();
00162
00163 for(uint i=0; i<itsObjects.size(); i++)
00164 {
00165 if (itsObjects[i].name != firstObj)
00166 {
00167 float dist = distanceSq(itsObjects[i].meanRGB, fv);
00168 if (dist < minDist2)
00169 {
00170 minDist2 = dist;
00171 secondObj = itsObjects[i].name;
00172 }
00173 }
00174 }
00175
00176 obj.name = firstObj;
00177 obj.confidence = minDist2/(minDist1+2.22044604925031e-16);
00178
00179
00180
00181
00182
00183
00184 } else {
00185 obj.confidence = -1;
00186 obj.name = "unknown";
00187 }
00188
00189 return obj;
00190 }
00191
00192 void postRecognition()
00193 {
00194 }
00195
00196 private:
00197
00198 FILE* itsFP;
00199 std::vector<ObjectRecData> itsObjects;
00200 std::string itsObjectsDBFile;
00201
00202 };
00203
00204
00205 extern "C" ObjRecBrain* createObjRecBrain(std::string dbFile)
00206 {
00207 return new ColorBrain(dbFile);
00208 }
00209
00210 extern "C" void destoryObjRecBrain(ObjRecBrain* brain)
00211 {
00212 delete brain;
00213 }
00214
00215
00216 int main(const int argc, const char **argv)
00217 {
00218 LFATAL("Use test-ObjRec");
00219 return 0;
00220 }
00221
00222
00223
00224
00225
00226