本文整理汇总了C++中KeyFrame类的典型用法代码示例。如果您正苦于以下问题:C++ KeyFrame类的具体用法?C++ KeyFrame怎么用?C++ KeyFrame使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了KeyFrame类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetKeyFrameForTime
void PartKeyFrames::GetKeyFrameForTime(float time, KeyFrame **prev, KeyFrame **next)
{
// go through all the keyframes, check time
KeyFrame *lastKeyFrame = NULL;
for (std::list<KeyFrame>::iterator i = keyFrames.begin(); i != keyFrames.end(); ++i)
{
KeyFrame *keyFrame = &(*i);
if (time > keyFrame->GetTime())
{
*prev = keyFrame;
}
else
{
*next = keyFrame;
return;
}
lastKeyFrame = keyFrame;
}
}
示例2:
void
DSPasteKeysCommand::addOrRemoveKeyframe(bool add)
{
for (std::list<boost::weak_ptr<DSKnob> >::const_iterator it = _dstKnobs.begin(); it != _dstKnobs.end(); ++it) {
DSKnobPtr knobContext = it->lock();
if (!knobContext) {
continue;
}
for (std::size_t i = 0; i < _keys.size(); ++i) {
int dim = knobContext->getDimension();
KnobIPtr knob = knobContext->getInternalKnob();
knob->beginChanges();
double keyTime = _keys[i].key.getTime();
double setTime = _pasteRelativeToRefTime ? keyTime - _keys[_refKeyindex].key.getTime() + _refTime : keyTime;
if (add) {
for (int j = 0; j < knob->getDimension(); ++j) {
if ( (dim == -1) || (j == dim) ) {
KeyFrame k = _keys[i].key;
k.setTime(setTime);
knob->setKeyFrame(k, ViewSpec::all(), j, eValueChangedReasonNatronGuiEdited);
}
}
} else {
for (int j = 0; j < knob->getDimension(); ++j) {
if ( (dim == -1) || (j == dim) ) {
knob->deleteValueAtTime(eCurveChangeReasonDopeSheet, setTime, ViewSpec::all(), j, i == 0);
}
}
}
knob->endChanges();
}
}
_model->refreshSelectionBboxAndRedrawView();
} // DSPasteKeysCommand::addOrRemoveKeyframe
示例3:
Natron::StatusEnum
Parametric_Knob::getNthControlPoint(int dimension,
int nthCtl,
double *key,
double *value)
{
///Mt-safe as Curve is MT-safe
if ( dimension >= (int)_curves.size() ) {
return eStatusFailed;
}
KeyFrame kf;
bool ret = _curves[dimension]->getKeyFrameWithIndex(nthCtl, &kf);
if (!ret) {
return eStatusFailed;
}
*key = kf.getTime();
*value = kf.getValue();
return eStatusOK;
}
示例4: merge
bool KeyFrame::merge(const KeyFrame &o)
{
if(getMeshes().size() == 0)
{
meshes = o.getMeshes();
}
else
{
if(getMeshes().size() != o.getMeshes().size())
return false;
for(vector<Mesh*>::const_iterator iter=o.getMeshes().begin();
iter != o.getMeshes().end();
++iter)
{
meshes.push_back(*iter);
}
}
return true;
}
示例5: fromJsonObject
void AnimationToJson::fromJsonObject(KeyFrame &keyFrame, const QJsonObject &object, const QString &fileName)
{
keyFrame.setFileName(QFileInfo(fileName).dir().absolutePath() + "/" + object.find("fileName").value().toString());
keyFrame.setOffset(pointFromJsonObject(object.find("offset").value().toObject()));
keyFrame.setRect(rectFromJsonObject(object.find("rect").value().toObject()));
QJsonObject customPropertiesObject = object.find("customProperties").value().toObject();
// qDebug() << customPropertiesObject;
for (auto it = customPropertiesObject.begin(); it != customPropertiesObject.end(); ++it) {
keyFrame.setCustomProperty(it.key(), it.value().toDouble());
}
// for (const auto &value : customPropertiesObject) {
// value.
// qDebug() << value;
// for (auto it = value.begin(); it != value.end(); ++it) {
// keyFrame.setCustomProperty(it.key(), it.value().toDouble());
// }
// }
for (const QJsonValue &value : object.find("hitBoxes").value().toArray()) {
auto hitBox = new HitBox();
fromJsonObject(*hitBox, value.toObject());
keyFrame.insertHitBox(keyFrame.hitBoxes().count(), hitBox);
}
}
示例6: toJsonObject
QJsonObject AnimationToJson::toJsonObject(const KeyFrame &keyFrame)
{
QJsonObject object;
object.insert("fileName", QFileInfo(keyFrame.fileName()).fileName());
object.insert("rect", toJsonObject(keyFrame.rect()));
// qDebug() << keyFrame.rect() << toJsonObject(keyFrame.rect());
object.insert("offset", toJsonObject(keyFrame.offset()));
QJsonObject customPropertiesObject;
const auto customProperties = keyFrame.customProperties();
for(auto it = customProperties.begin(); it != customProperties.end(); ++it) {
customPropertiesObject.insert(it.key(), it.value());
}
object.insert("customProperties", customPropertiesObject);
QJsonArray hitBoxes;
for (HitBox *hitBox : keyFrame.hitBoxes()) {
hitBoxes.append(toJsonObject(*hitBox));
}
object.insert("hitBoxes", hitBoxes);
return object;
}
示例7: lock1
void MapPoint::UpdateNormalAndDepth()
{
map<KeyFrame*,size_t> observations;
KeyFrame* pRefKF;
cv::Mat Pos;
{
boost::mutex::scoped_lock lock1(mMutexFeatures);
boost::mutex::scoped_lock lock2(mMutexPos);
if(mbBad)
return;
observations=mObservations;
pRefKF=mpRefKF;
Pos = mWorldPos.clone();
}
cv::Mat normal = cv::Mat::zeros(3,1,CV_32F);
int n=0;
for(map<KeyFrame*,size_t>::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++)
{
KeyFrame* pKF = mit->first;
cv::Mat Owi = pKF->GetCameraCenter();
cv::Mat normali = mWorldPos - Owi;
normal = normal + normali/cv::norm(normali);
n++;
}
cv::Mat PC = Pos - pRefKF->GetCameraCenter();
const float dist = cv::norm(PC);
const int level = pRefKF->GetKeyPointScaleLevel(observations[pRefKF]);
const float scaleFactor = pRefKF->GetScaleFactor();
const float levelScaleFactor = pRefKF->GetScaleFactor(level);
const int nLevels = pRefKF->GetScaleLevels();
{
boost::mutex::scoped_lock lock3(mMutexPos);
mfMinDistance = (1.0f/scaleFactor)*dist / levelScaleFactor;
mfMaxDistance = scaleFactor*dist * pRefKF->GetScaleFactor(nLevels-1-level);
mNormalVector = normal/n;
}
}
示例8: KeyFrameCulling
void LocalMapping::KeyFrameCulling()
{
// Check redundant keyframes (only local keyframes)
// A keyframe is considered redundant if the 90% of the MapPoints it sees, are seen
// in at least other 3 keyframes (in the same or finer scale)
vector<KeyFrame*> vpLocalKeyFrames = mpCurrentKeyFrame->GetVectorCovisibleKeyFrames();
for(vector<KeyFrame*>::iterator vit=vpLocalKeyFrames.begin(), vend=vpLocalKeyFrames.end(); vit!=vend; vit++)
{
KeyFrame* pKF = *vit;
if(pKF->mnId==0)
continue;
vector<MapPoint*> vpMapPoints = pKF->GetMapPointMatches();
int nRedundantObservations=0;
int nMPs=0;
for(size_t i=0, iend=vpMapPoints.size(); i<iend; i++)
{
MapPoint* pMP = vpMapPoints[i];
if(pMP)
{
if(!pMP->isBad())
{
nMPs++;
if(pMP->Observations()>3)
{
int scaleLevel = pKF->GetKeyPointUn(i).octave;
map<KeyFrame*, size_t> observations = pMP->GetObservations();
int nObs=0;
for(map<KeyFrame*, size_t>::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++)
{
KeyFrame* pKFi = mit->first;
if(pKFi==pKF)
continue;
int scaleLeveli = pKFi->GetKeyPointUn(mit->second).octave;
if(scaleLeveli<=scaleLevel+1)
{
nObs++;
if(nObs>=3)
break;
}
}
if(nObs>=3)
{
nRedundantObservations++;
}
}
}
}
}
if(nRedundantObservations>0.9*nMPs)
pKF->SetBadFlag();
}
}
示例9: l
bool Curve::addKeyFrame(KeyFrame key)
{
QWriteLocker l(&_imp->_lock);
if (_imp->type == CurvePrivate::BOOL_CURVE || _imp->type == CurvePrivate::STRING_CURVE) {
key.setInterpolation(Natron::KEYFRAME_CONSTANT);
}
std::pair<KeyFrameSet::iterator,bool> it = addKeyFrameNoUpdate(key);
evaluateCurveChanged(KEYFRAME_CHANGED,it.first);
l.unlock();
///This call must not be locked!
if (_imp->owner) {
_imp->owner->evaluateAnimationChange();
}
return it.second;
}
示例10: getUpperBound
bool AnimationTrack::getFrame(f32 timeMs, KeyFrame& frame) const
{
array_t<KeyFrame*>::const_iterator iterKeyframeBefore;
array_t<KeyFrame*>::const_iterator iterKeyframeAfter;
// get the key frame after the requested time
iterKeyframeAfter = getUpperBound(timeMs);
// check if the time is after the last key frame
if(iterKeyframeAfter == m_keyFrames.end())
{
// return the last key frame
--iterKeyframeAfter;
frame = *(*iterKeyframeAfter);
return true;
}
// check if the time is before the first key frame
if(iterKeyframeAfter == m_keyFrames.begin())
{
// return the first key frame
frame = *(*iterKeyframeAfter);
return true;
}
// get the key frame before the requested one
iterKeyframeBefore = iterKeyframeAfter;
--iterKeyframeBefore;
// get the two key frame
KeyFrame& keyframeBefore = *(*iterKeyframeBefore);
KeyFrame& keyframeAfter = *(*iterKeyframeAfter);
// blend between the two key frames
//Note: use interp type of compute time blend pct, and use linear for value interp, and should take care of rotation
frame.interpolateValueFrom(keyframeBefore, keyframeAfter);
return true;
}
示例11: sender
void
KnobGui::onSetKeyActionTriggered()
{
QAction* action = qobject_cast<QAction*>( sender() );
assert(action);
int dim = action->data().toInt();
KnobPtr knob = getKnob();
assert( knob->getHolder()->getApp() );
//get the current time on the global timeline
SequenceTime time = knob->getHolder()->getApp()->getTimeLine()->currentFrame();
AddKeysCommand::KeysToAddList toAdd;
KnobGuiPtr thisShared = shared_from_this();
for (int i = 0; i < knob->getDimension(); ++i) {
if ( (dim == -1) || (i == dim) ) {
std::list<boost::shared_ptr<CurveGui> > curves = getGui()->getCurveEditor()->findCurve(thisShared, i);
for (std::list<boost::shared_ptr<CurveGui> >::iterator it = curves.begin(); it != curves.end(); ++it) {
AddKeysCommand::KeyToAdd keyToAdd;
KeyFrame kf;
kf.setTime(time);
Knob<int>* isInt = dynamic_cast<Knob<int>*>( knob.get() );
Knob<bool>* isBool = dynamic_cast<Knob<bool>*>( knob.get() );
AnimatingKnobStringHelper* isString = dynamic_cast<AnimatingKnobStringHelper*>( knob.get() );
Knob<double>* isDouble = dynamic_cast<Knob<double>*>( knob.get() );
if (isInt) {
kf.setValue( isInt->getValue(i) );
} else if (isBool) {
kf.setValue( isBool->getValue(i) );
} else if (isDouble) {
kf.setValue( isDouble->getValue(i) );
} else if (isString) {
std::string v = isString->getValue(i);
double dv;
isString->stringToKeyFrameValue(time, ViewIdx(0), v, &dv);
kf.setValue(dv);
}
keyToAdd.keyframes.push_back(kf);
keyToAdd.curveUI = *it;
keyToAdd.knobUI = thisShared;
keyToAdd.dimension = i;
toAdd.push_back(keyToAdd);
}
}
}
pushUndoCommand( new AddKeysCommand(getGui()->getCurveEditor()->getCurveWidget(), toAdd) );
}
示例12: matcher
bool LoopClosing::ComputeSim3()
{
// For each consistent loop candidate we try to compute a Sim3
const int nInitialCandidates = mvpEnoughConsistentCandidates.size();
// We compute first ORB matches for each candidate
// If enough matches are found, we setup a Sim3Solver
ORBmatcher matcher(0.75,true);
vector<Sim3Solver*> vpSim3Solvers;
vpSim3Solvers.resize(nInitialCandidates);
vector<vector<MapPoint*> > vvpMapPointMatches;
vvpMapPointMatches.resize(nInitialCandidates);
vector<bool> vbDiscarded;
vbDiscarded.resize(nInitialCandidates);
int nCandidates=0; //candidates with enough matches
for(int i=0; i<nInitialCandidates; i++)
{
KeyFrame* pKF = mvpEnoughConsistentCandidates[i];
// avoid that local mapping erase it while it is being processed in this thread
pKF->SetNotErase();
if(pKF->isBad())
{
vbDiscarded[i] = true;
continue;
}
int nmatches = matcher.SearchByBoW(mpCurrentKF,pKF,vvpMapPointMatches[i]);
if(nmatches<20)
{
vbDiscarded[i] = true;
continue;
}
else
{
Sim3Solver* pSolver = new Sim3Solver(mpCurrentKF,pKF,vvpMapPointMatches[i]);
pSolver->SetRansacParameters(0.99,20,300);
vpSim3Solvers[i] = pSolver;
}
nCandidates++;
}
bool bMatch = false;
// Perform alternatively RANSAC iterations for each candidate
// until one is succesful or all fail
while(nCandidates>0 && !bMatch)
{
for(int i=0; i<nInitialCandidates; i++)
{
if(vbDiscarded[i])
continue;
KeyFrame* pKF = mvpEnoughConsistentCandidates[i];
// Perform 5 Ransac Iterations
vector<bool> vbInliers;
int nInliers;
bool bNoMore;
Sim3Solver* pSolver = vpSim3Solvers[i];
cv::Mat Scm = pSolver->iterate(5,bNoMore,vbInliers,nInliers);
// If Ransac reachs max. iterations discard keyframe
if(bNoMore)
{
vbDiscarded[i]=true;
nCandidates--;
}
// If RANSAC returns a Sim3, perform a guided matching and optimize with all correspondences
if(!Scm.empty())
{
vector<MapPoint*> vpMapPointMatches(vvpMapPointMatches[i].size(), static_cast<MapPoint*>(NULL));
for(size_t j=0, jend=vbInliers.size(); j<jend; j++)
{
if(vbInliers[j])
vpMapPointMatches[j]=vvpMapPointMatches[i][j];
}
cv::Mat R = pSolver->GetEstimatedRotation();
cv::Mat t = pSolver->GetEstimatedTranslation();
const float s = pSolver->GetEstimatedScale();
matcher.SearchBySim3(mpCurrentKF,pKF,vpMapPointMatches,s,R,t,7.5);
g2o::Sim3 gScm(Converter::toMatrix3d(R),Converter::toVector3d(t),s);
const int nInliers = Optimizer::OptimizeSim3(mpCurrentKF, pKF, vpMapPointMatches, gScm, 10);
// If optimization is succesful stop ransacs and continue
if(nInliers>=20)
//.........这里部分代码省略.........
示例13:
// Finds nMaxNum closest KeyFrames, within a given distance, within a given region
std::vector<KeyFrame*> MapMakerBase::ClosestKeyFramesWithinDist(KeyFrame& kf, double dThreshDist, unsigned nMaxNum,
KeyFrameRegion region)
{
std::vector<KeyFrame*> vResult;
std::vector<std::pair<double, KeyFrame*>> vpDistsAndKeyFrames;
MultiKeyFrame& parent = *kf.mpParent;
if (region == KF_ONLY_SELF) // Only search through parent's keyframes
{
for (KeyFramePtrMap::iterator it = parent.mmpKeyFrames.begin(); it != parent.mmpKeyFrames.end(); it++)
{
KeyFrame& currentKF = *(it->second);
if (¤tKF == &kf)
continue;
double dDist = kf.Distance(currentKF);
if (dDist <= dThreshDist)
{
vpDistsAndKeyFrames.push_back(std::make_pair(dDist, ¤tKF));
}
}
}
else // Otherwise search all keyframes in the map
{
for (MultiKeyFramePtrList::iterator it = mMap.mlpMultiKeyFrames.begin(); it != mMap.mlpMultiKeyFrames.end(); ++it)
{
MultiKeyFrame& mkf = *(*it);
if (&mkf == &parent && region == KF_ONLY_OTHER)
continue;
for (KeyFramePtrMap::iterator jit = mkf.mmpKeyFrames.begin(); jit != mkf.mmpKeyFrames.end(); ++jit)
{
KeyFrame& currentKF = *(jit->second);
if (¤tKF == &kf)
continue;
double dDist = kf.Distance(currentKF);
if (dDist <= dThreshDist)
{
vpDistsAndKeyFrames.push_back(std::make_pair(dDist, ¤tKF));
}
}
}
}
if (!vpDistsAndKeyFrames.empty())
{
if (nMaxNum > vpDistsAndKeyFrames.size()) // if we expect too many neighbors
nMaxNum = vpDistsAndKeyFrames.size(); // reduce number that will be returned
// Sort the first nMaxNum entries by score
std::partial_sort(vpDistsAndKeyFrames.begin(), vpDistsAndKeyFrames.begin() + nMaxNum, vpDistsAndKeyFrames.end());
for (unsigned int i = 0; i < nMaxNum; i++)
vResult.push_back(vpDistsAndKeyFrames[i].second);
}
return vResult;
}
示例14: while
void PluginSet::paste_keyframes(int64_t start,
int64_t length,
FileXML *file,
int default_only,
int active_only)
{
int result = 0;
int first_keyframe = 1;
Plugin *current;
while(!result)
{
result = file->read_tag();
if(!result)
{
if(file->tag.title_is("/PLUGINSET"))
result = 1;
else
if(file->tag.title_is("KEYFRAME"))
{
int64_t position = file->tag.get_property("POSITION", 0);
if(first_keyframe && default_only)
{
position = start;
}
else
{
position += start;
}
// Get plugin owning keyframe
for(current = (Plugin*)last;
current;
current = (Plugin*)PREVIOUS)
{
// We want keyframes to exist beyond the end of the last plugin to
// make editing intuitive, but it will always be possible to
// paste keyframes from one plugin into an incompatible plugin.
if(position >= current->startproject)
{
KeyFrame *keyframe = 0;
if(file->tag.get_property("DEFAULT", 0) || default_only)
{
keyframe = (KeyFrame*)current->keyframes->default_auto;
}
else
if(!default_only)
{
keyframe =
(KeyFrame*)current->keyframes->insert_auto(position);
}
if(keyframe)
{
keyframe->load(file);
keyframe->position = position;
}
break;
}
}
first_keyframe = 0;
}
}
}
}
示例15: operator
bool operator()(const KeyFrame & f)
{
return f.getTime() == _t;
}