$search
00001 00060 #ifndef __COB_3D_MAPPING_COMMON_LABEL_RESULTS_H__ 00061 #define __COB_3D_MAPPING_COMMON_LABEL_RESULTS_H__ 00062 00063 #include <ostream> 00064 #include <fstream> 00065 #include <sstream> 00066 #include <limits> 00067 #include <string> 00068 #include "cob_3d_mapping_common/label_defines.h" 00069 00070 #define NUM_LBL 7 00071 00072 namespace cob_3d_mapping_common 00073 { 00074 class LabelResults 00075 { 00076 public: 00077 LabelResults(const std::string &rn, 00078 const std::string &rf, 00079 const bool mls) : rn_(rn), rf_(rf), mls_(mls), undef(0) 00080 { 00081 for (size_t i = 0; i < NUM_LBL; ++i) 00082 { 00083 exp[i] = 0; 00084 fp[i] = 0; 00085 fn[i] = 0; 00086 tp[i] = 0; 00087 tn[i] = 0; 00088 prec[i] = 0.0; 00089 rec[i] = 0.0; 00090 f1[i] = 0.0; 00091 } 00092 } 00093 00094 void calcResults() 00095 { 00096 all = 0; 00097 for(size_t i = 0; i < NUM_LBL; ++i) 00098 { 00099 all = exp[EVAL_PLANE]+exp[EVAL_EDGE]+exp[EVAL_SPH]+exp[EVAL_CYL]+exp[EVAL_COR]; 00100 } 00101 for(size_t i = 0; i < NUM_LBL; ++i) 00102 { 00103 tp[i] = exp[i] - fn[i]; 00104 tn[i] = all - exp[i] - fp[i]; 00105 prec[i] = (float)tp[i] / (tp[i] + fp[i]); 00106 rec[i] = (float)tp[i] / (tp[i] + fn[i]); 00107 f1[i] = 2.0f * prec[i] * rec[i] / (prec[i] + rec[i]); 00108 } 00109 } 00110 00111 std::string writeToFile(const std::string &file, 00112 const std::string &p1 = "", 00113 const std::string &p2 = "", 00114 const std::string &p3 = "", 00115 const std::string &p4 = "") const 00116 { 00117 std::stringstream f; 00118 f << rn_ <<";"<< rf_ <<";"<< mls_ <<";"; 00119 if (p1 == "") 00120 f << all <<";"<< undef <<";"; 00121 else if (p2 == "") 00122 f << p1 <<";"<< all <<";"<< undef <<";"; 00123 else if (p3 == "") 00124 f << p1 <<";"<< p2 <<";"<< all <<";"<< undef <<";"; 00125 else if (p4 == "") 00126 f << p1 <<";"<< p2 <<";"<< p3 <<";"<< all <<";"<< undef <<";"; 00127 else 00128 f << p1 <<";"<< p2 <<";"<< p3 <<";"<< p4 <<";"<< all <<";"<< undef <<";"; 00129 00130 for(size_t i = 0; i < NUM_LBL; ++i) 00131 { 00132 f << exp[i] <<";"<< tp[i] <<";"<< fp[i] <<";"<< fn[i] <<";" 00133 << prec[i] <<";"<< rec[i] <<";"<< f1[i] <<";"; 00134 } 00135 if (file != "") 00136 { 00137 std::fstream ffile; 00138 ffile.open(file.c_str(), std::fstream::out | std::fstream::app); 00139 ffile << f << std::endl; 00140 ffile.close(); 00141 } 00142 return f.str(); 00143 } 00144 00145 std::string writeToFile(const std::string &file, 00146 const float p1 = std::numeric_limits<float>::quiet_NaN(), 00147 const float p2 = std::numeric_limits<float>::quiet_NaN(), 00148 const float p3 = std::numeric_limits<float>::quiet_NaN(), 00149 const float p4 = std::numeric_limits<float>::quiet_NaN()) const 00150 { 00151 std::stringstream f; 00152 f << rn_ <<";"<< rf_ <<";"<< mls_ <<";"; 00153 if (p1 != p1) 00154 f << all <<";"<< undef <<";"; 00155 else if (p2 != p2) 00156 f << p1 <<";"<< all <<";"<< undef <<";"; 00157 else if (p3 != p3) 00158 f << p1 <<";"<< p2 <<";"<< all <<";"<< undef <<";"; 00159 else if (p4 != p4) 00160 f << p1 <<";"<< p2 <<";"<< p3 <<";"<< all <<";"<< undef <<";"; 00161 else 00162 f << p1 <<";"<< p2 <<";"<< p3 <<";"<< p4 <<";"<< all <<";"<< undef <<";"; 00163 00164 for(size_t i = 0; i < NUM_LBL; ++i) 00165 { 00166 f << exp[i] <<";"<< tp[i] <<";"<< fp[i] <<";"<< fn[i] <<";" 00167 << prec[i] <<";"<< rec[i] <<";"<< f1[i] <<";"; 00168 } 00169 if (file != "") 00170 { 00171 std::fstream ffile; 00172 ffile.open(file.c_str(), std::fstream::out | std::fstream::app); 00173 ffile << f.str() << std::endl; 00174 ffile.close(); 00175 } 00176 return f.str(); 00177 } 00178 00179 std::string writeToFile(const std::string &file = "") const 00180 { 00181 std::stringstream f; 00182 f << rn_ <<";"<< rf_ <<";"<< mls_ <<";"<< all <<";"<< undef <<";"; 00183 00184 00185 for(size_t i = 0; i < NUM_LBL; ++i) 00186 { 00187 f << exp[i] <<";"<< tp[i] <<";"<< fp[i] <<";"<< fn[i] <<";" 00188 << prec[i] <<";"<< rec[i] <<";"<< f1[i] <<";"; 00189 } 00190 if (file != "") 00191 { 00192 std::fstream ffile; 00193 ffile.open(file.c_str(), std::fstream::out | std::fstream::app); 00194 ffile << f.str() << std::endl; 00195 ffile.close(); 00196 } 00197 return f.str(); 00198 } 00199 00200 00201 friend std::ostream& operator<< (std::ostream &os,const LabelResults &obj); 00202 00203 public: 00204 int exp [NUM_LBL]; 00205 int fp [NUM_LBL]; 00206 int fn [NUM_LBL]; 00207 int tp [NUM_LBL]; 00208 int tn [NUM_LBL]; 00209 int undef; 00210 int all; 00211 float prec [NUM_LBL]; 00212 float rec [NUM_LBL]; 00213 float f1 [NUM_LBL]; 00214 00215 private: 00216 std::string rn_; 00217 std::string rf_; 00218 bool mls_; 00219 }; 00220 00221 std::ostream& operator<< (std::ostream &os, LabelResults &obj) 00222 { 00223 obj.calcResults(); 00224 os << obj.writeToFile(); 00225 return os; 00226 } 00227 00228 std::string writeHeader(const std::string &file = "", 00229 const std::string &p1 = "", 00230 const std::string &p2 = "", 00231 const std::string &p3 = "", 00232 const std::string &p4 = "") 00233 { 00234 std::stringstream f; 00235 f << "rn;"<<"rf;"<<"mls;"; 00236 if (p1 != "") 00237 { 00238 if (p2 == "") 00239 f << p1 <<";"; 00240 else if (p3 == "") 00241 f << p1 <<";" << p2 <<";"; 00242 else if (p4 == "") 00243 f << p1 <<";" << p2 <<";" << p3 <<";"; 00244 else 00245 f << p1 <<";" << p2 <<";" << p3 <<";" << p4 <<";"; 00246 } 00247 00248 f << "all;"<<"undef;" 00249 << "exp(Plane);"<<"TP;"<<"FP;"<<"FN;"<<"Prec.;"<<"Rec.;"<<"F1;" 00250 << "exp(Edge);"<<"TP;"<<"FP;"<<"FN;"<<"Prec.;"<<"Rec.;"<<"F1;" 00251 << "exp(Sphere);"<<"TP;"<<"FP;"<<"FN;"<<"Prec.;"<<"Rec.;"<<"F1;" 00252 << "exp(Cylinder);"<<"TP;"<<"FP;"<<"FN;"<<"Prec.;"<<"Rec.;"<<"F1;" 00253 << "exp(Corner);"<<"TP;"<<"FP;"<<"FN;"<<"Prec.;"<<"Rec.;"<<"F1;" 00254 << "exp(EdgeCorner);"<<"TP;"<<"FP;"<<"FN;"<<"Prec.;"<<"Rec.;"<<"F1;" 00255 << "exp(Curved);"<<"TP;"<<"FP;"<<"FN;"<<"Prec.;"<<"Rec.;"<<"F1;"; 00256 00257 if (file != "") 00258 { 00259 std::fstream ffile; 00260 ffile.open(file.c_str(), std::fstream::out); 00261 ffile << f.str() << std::endl; 00262 ffile.close(); 00263 } 00264 return f.str(); 00265 } 00266 00267 std::string createTimestamp() 00268 { 00269 struct tm *t; 00270 time_t rawtime; 00271 time(&rawtime); 00272 t = localtime(&rawtime); 00273 std::stringstream stamp; 00274 stamp << (t->tm_year+1900); 00275 if (t->tm_mon+1 < 10) stamp << "0"; 00276 stamp << t->tm_mon+1; 00277 if (t->tm_mday < 10) stamp << "0"; 00278 stamp << t->tm_mday << "_"; 00279 if (t->tm_hour < 10) stamp << "0"; 00280 stamp << t->tm_hour; 00281 if (t->tm_min < 10) stamp << "0"; 00282 stamp << t->tm_min; 00283 if (t->tm_sec < 10) stamp << "0"; 00284 stamp << t->tm_sec; 00285 00286 return stamp.str(); 00287 } 00288 00289 void parseFileName(const std::string &file, 00290 std::string &rn, 00291 std::string &rf, 00292 bool &is_mls) 00293 { 00294 std::string tmp = ""; 00295 if (std::string::npos != file.rfind("rnmls_")) 00296 { 00297 is_mls = true; 00298 rn = tmp + file[file.length() - 18] + file[file.length() - 17] + file[file.length() - 16]; 00299 } 00300 else 00301 { 00302 is_mls = false; 00303 rn = tmp + file[file.length() - 15] + file[file.length() - 14] + file[file.length() - 13]; 00304 } 00305 rf = tmp + file[file.length() - 9] + file[file.length() - 8] + file[file.length() - 7]; 00306 00307 return; 00308 } 00309 } 00310 00311 #endif