void BroadEstepper1::update_mean_broad() { int PPF=_opts.tune_pseudopoint_factor; valarray<double>pmean(G); for (int k=0; k<G; k++) pmean[k] = _prior.mean(_cvec[k]); int num_pseudopoints = int(N/PPF); if (!num_pseudopoints) num_pseudopoints = 1; valarray<double>xmean(0.0,G); for (int k=0; k<G; k++) { double kwsum=0.0, wsum=0.0; for (int i=0; i<N; i++) { kwsum += _vals[i]*_prob.element(i,k); wsum += _prob.element(i,k); if (wsum > 0.0) xmean[k] = kwsum/wsum; } } for (int k=0; k<G; k++) { _mean[k] = xmean[k]*N*_prop[k] + pmean[k]*num_pseudopoints; _mean[k] /= N*_prop[k] + num_pseudopoints; } }
/*! @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)); }