bool loadKeyframes( KeyframeVector& keyframes, const std::string& path) { keyframes.clear(); int kf_idx = 0; while(true) { std::stringstream ss_idx; ss_idx << std::setw(4) << std::setfill('0') << kf_idx; std::string path_kf = path + "/" + ss_idx.str(); if (boost::filesystem::exists(path_kf)) { ROS_INFO("Loading %s", path_kf.c_str()); RGBDKeyframe keyframe; bool result_load = RGBDKeyframe::load(keyframe, path_kf); if (result_load) keyframes.push_back(keyframe); else { ROS_WARN("Error loading"); return false; } } else return true; kf_idx++; } }
KeyframeEffectModelBase::KeyframeVector KeyframeEffectModelBase::normalizedKeyframes(const KeyframeVector& keyframes) { double lastOffset = 0; KeyframeVector result; result.reserveCapacity(keyframes.size()); for (const auto& keyframe : keyframes) { double offset = keyframe->offset(); if (!isNull(offset)) { DCHECK_GE(offset, 0); DCHECK_LE(offset, 1); DCHECK_GE(offset, lastOffset); lastOffset = offset; } result.push_back(keyframe->clone()); } if (result.isEmpty()) return result; if (isNull(result.back()->offset())) result.back()->setOffset(1); if (result.size() > 1 && isNull(result[0]->offset())) result.front()->setOffset(0); size_t lastIndex = 0; lastOffset = result.front()->offset(); for (size_t i = 1; i < result.size(); ++i) { double offset = result[i]->offset(); if (!isNull(offset)) { for (size_t j = 1; j < i - lastIndex; ++j) result[lastIndex + j]->setOffset( lastOffset + (offset - lastOffset) * j / (i - lastIndex)); lastIndex = i; lastOffset = offset; } } return result; }