//============================================================================== vector<Point2f> face_tracker:: fit(const Mat &image, const vector<Point2f> &init, const Size ssize, const bool robust, const int itol, const float ftol) { int n = smodel.npts(); assert((int(init.size())==n) && (pmodel.n_patches()==n)); smodel.calc_params(init); vector<Point2f> pts = smodel.calc_shape(); //find facial features in image around current estimates vector<Point2f> peaks = pmodel.calc_peaks(image,pts,ssize); //optimise if(!robust){ smodel.calc_params(peaks); //compute shape model parameters pts = smodel.calc_shape(); //update shape }else{ Mat weight(n,1,CV_32F),weight_sort(n,1,CV_32F); vector<Point2f> pts_old = pts; for(int iter = 0; iter < itol; iter++){ //compute robust weight for(int i = 0; i < n; i++)weight.fl(i) = norm(pts[i] - peaks[i]); cv::sort(weight,weight_sort,CV_SORT_EVERY_COLUMN|CV_SORT_ASCENDING); double var = 1.4826*weight_sort.fl(n/2); if(var < 0.1)var = 0.1; pow(weight,2,weight); weight *= -0.5/(var*var); cv::exp(weight,weight); //compute shape model parameters smodel.calc_params(peaks,weight); //update shape pts = smodel.calc_shape(); //check for convergence float v = 0; for(int i = 0; i < n; i++)v += norm(pts[i]-pts_old[i]); if(v < ftol)break; else pts_old = pts; } }return pts; }
void run_test2(t_algo *best, t_info *info) { t_info *w_sort; w_sort = weight_sort(info); compress_ops(w_sort->steps, &w_sort->elem_steps); rollback_sort(info); compress_ops(info->steps, &info->elem_steps); if (info->elem_steps < best->op_count && stack_sorted(info->a)) { if (info->elem_steps < w_sort->elem_steps) print_steps(info->steps); else print_steps(w_sort->steps); } else print_steps(best->operations); delete_mask(w_sort); delete_mask(info); }