static void DiscardMissizedFaces( vec_DetPar& detpars) // io { // constants (TODO These have not yet been rigorously empirically adjusted.) static const double MIN_WIDTH = 1.33; // as fraction of median width static const double MAX_WIDTH = 1.33; // as fraction of median width if (NSIZE(detpars) >= 3) // need at least 3 faces { // sort the faces on their width (smallest first) so can get median width sort(detpars.begin(), detpars.end(), DecreasingWidth); const int median = cvRound(detpars[NSIZE(detpars) / 2].width); const int minallowed = cvRound(median / MIN_WIDTH); const int maxallowed = cvRound(MAX_WIDTH * median); // keep only faces that are not too big or small vec_DetPar all_detpars(detpars); detpars.resize(0); for (int iface = 0; iface < NSIZE(all_detpars); iface++) { DetPar* face = &all_detpars[iface]; if (face->width >= minallowed && face->width <= maxallowed) detpars.push_back(*face); else if (trace_g || TRACE_IMAGES) lprintf("[discard face%d of %d]", iface, NSIZE(all_detpars)); } } }