/*! @brief create a single bounding box around the detection from mean and standard deviation * * @return a bounding box */ cv::Rect boundingBoxNorm(void) const { const unsigned int nparts = parts_.size(); cv::Mat_<int> xpts(cv::Size(1,nparts)); cv::Mat_<int> ypts(cv::Size(1,nparts)); for (unsigned int n = 0; n < nparts; ++n) { const cv::Point centroid = (parts_[n].tl() + parts_[n].br())*0.5; xpts(n) = centroid.x; ypts(n) = centroid.y; } cv::Scalar xmean, ymean, xstd, ystd; cv::meanStdDev(xpts, xmean, xstd); cv::meanStdDev(ypts, ymean, ystd); return cv::Rect(xmean(0)-1.5*xstd(0), ymean(0)-1.5*ystd(0), 3*xstd(0), 3*ystd(0)); }
double run_nlopt(nlopt::algorithm algo, eval_func fpointer, vectord& Xnext, int maxf, const std::vector<double>& vd, const std::vector<double>& vu, void* objPointer) { double fmin = 0.0; size_t n = Xnext.size(); nlopt::opt opt (algo,n); std::vector<double> xstd(n); opt.set_lower_bounds(vd); opt.set_upper_bounds(vu); opt.set_min_objective(fpointer, objPointer); opt.set_maxeval(maxf); // It seems BOBYQA can be unstable if the same point is repeated // tested over and over. NLOPT bug? opt.set_ftol_rel(1e-12); opt.set_ftol_abs(1e-12); std::copy(Xnext.begin(),Xnext.end(),xstd.begin()); try { opt.optimize(xstd, fmin); } catch (nlopt::roundoff_limited& e) { FILE_LOG(logDEBUG) << "NLOPT Warning: Potential roundoff error. " << "In general, this can be ignored."; } std::copy(xstd.begin(),xstd.end(),Xnext.begin()); return fmin; }