int createLevels(const int fh, const int fw) { std::vector<device::Level> vlevels; float logFactor = (::log(maxScale) - ::log(minScale)) / (totals -1); float scale = minScale; int dcs = 0; for (int sc = 0; sc < totals; ++sc) { int width = (int)::std::max(0.0f, fw - (origObjWidth * scale)); int height = (int)::std::max(0.0f, fh - (origObjHeight * scale)); float logScale = ::log(scale); int fit = fitOctave(voctaves, logScale); device::Level level(fit, voctaves[fit], scale, width, height); if (!width || !height) break; else { vlevels.push_back(level); if (voctaves[fit].scale < 1) ++dcs; } if (::fabs(scale - maxScale) < FLT_EPSILON) break; scale = ::std::min(maxScale, ::expf(::log(scale) + logFactor)); } cv::Mat hlevels = cv::Mat(1, (int) (vlevels.size() * sizeof(device::Level)), CV_8UC1, (uchar*)&(vlevels[0]) ); CV_Assert(!hlevels.empty()); levels.upload(hlevels); downscales = dcs; return dcs; }
// compute levels of full pyramid void calcLevels(const cv::Size& curr, float mins, float maxs, int total) { if (frameSize == curr && maxs == maxScale && mins == minScale && total == scales) return; frameSize = curr; maxScale = maxs; minScale = mins; scales = total; CV_Assert(scales > 1); levels.clear(); float logFactor = (log(maxScale) - log(minScale)) / (scales -1); float scale = minScale; for (int sc = 0; sc < scales; ++sc) { int width = static_cast<int>(std::max(0.0f, frameSize.width - (origObjWidth * scale))); int height = static_cast<int>(std::max(0.0f, frameSize.height - (origObjHeight * scale))); float logScale = log(scale); octIt_t fit = fitOctave(logScale); Level level(*fit, scale, shrinkage, width, height); if (!width || !height) break; else levels.push_back(level); if (fabs(scale - maxScale) < FLT_EPSILON) break; scale = std::min(maxScale, expf(log(scale) + logFactor)); } }