double PatchVariance::computeVariance(const BoundingBox& patch) const { double sum = integralImg.at<double>(patch.br()) - integralImg.at<double>(patch.br().y, patch.x) - integralImg.at<double>(patch.y, patch.br().x) + integralImg.at<double>(patch.tl()); double sumSq = sqIntegralImg.at<double>(patch.br()) - sqIntegralImg.at<double>(patch.br().y, patch.x) - sqIntegralImg.at<double>(patch.y, patch.br().x) + sqIntegralImg.at<double>(patch.tl()); return sumSq / patch.area() - pow(sum / patch.area(), 2); }
double TLD::getVar(const BoundingBox& box,const Mat& sum,const Mat& sqsum){ double brs = sum.at<int>(box.y+box.height,box.x+box.width); double bls = sum.at<int>(box.y+box.height,box.x); double trs = sum.at<int>(box.y,box.x+box.width); double tls = sum.at<int>(box.y,box.x); double brsq = sqsum.at<double>(box.y+box.height,box.x+box.width); double blsq = sqsum.at<double>(box.y+box.height,box.x); double trsq = sqsum.at<double>(box.y,box.x+box.width); double tlsq = sqsum.at<double>(box.y,box.x); double mean = (brs+tls-trs-bls)/((double)box.area()); double sqmean = (brsq+tlsq-trsq-blsq)/((double)box.area()); return sqmean-mean*mean; }
bool BezierCurve::intersectBox(BezierSpline & spline, const BoundingBox & box) { BoundingBox abox; spline.getAabb(&abox); if(!abox.intersect(box)) return false; if(abox.inside(box)) return true; BezierSpline stack[64]; int stackSize = 2; spline.deCasteljauSplit(stack[0], stack[1]); while(stackSize > 0) { BezierSpline c = stack[stackSize - 1]; stackSize--; abox.reset(); abox.expandBy(c.cv[0]); abox.expandBy(c.cv[1]); abox.expandBy(c.cv[2]); abox.expandBy(c.cv[3]); if(abox.inside(box)) return true; if(abox.intersect(box)) { if(abox.area() < 0.0001f) return true; BezierSpline a, b; c.deCasteljauSplit(a, b); stack[ stackSize ] = a; stackSize++; stack[ stackSize ] = b; stackSize++; } } return false; }