⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyframe.cc

📁 this is software for visual SLAM
💻 CC
字号:
// Copyright 2008 Isis Innovation Limited#include "KeyFrame.h"#include "ShiTomasi.h"#include "SmallBlurryImage.h"#include <cvd/vision.h>#include <cvd/fast_corner.h>using namespace CVD;using namespace std;using namespace GVars3;void KeyFrame::MakeKeyFrame_Lite(BasicImage<byte> &im){  // Perpares a Keyframe from an image. Generates pyramid levels, does FAST detection, etc.  // Does not fully populate the keyframe struct, but only does the bits needed for the tracker;  // e.g. does not perform FAST nonmax suppression. Things like that which are needed by the   // mapmaker but not the tracker go in MakeKeyFrame_Rest();    // First, copy out the image data to the pyramid's zero level.  aLevels[0].im.resize(im.size());  copy(im, aLevels[0].im);  // Then, for each level...  for(int i=0; i<LEVELS; i++)    {      Level &lev = aLevels[i];      if(i!=0)	{  // .. make a half-size image from the previous level..	  lev.im.resize(aLevels[i-1].im.size() / 2);	  halfSample(aLevels[i-1].im, lev.im);	}            // .. and detect and store FAST corner points.      // I use a different threshold on each level; this is a bit of a hack      // whose aim is to balance the different levels' relative feature densities.      lev.vCorners.clear();      lev.vCandidates.clear();      lev.vMaxCorners.clear();      if(i == 0)	fast_corner_detect_10(lev.im, lev.vCorners, 10);      if(i == 1)	fast_corner_detect_10(lev.im, lev.vCorners, 15);      if(i == 2)	fast_corner_detect_10(lev.im, lev.vCorners, 15);      if(i == 3)	fast_corner_detect_10(lev.im, lev.vCorners, 10);            // Generate row look-up-table for the FAST corner points: this speeds up       // finding close-by corner points later on.      unsigned int v=0;      lev.vCornerRowLUT.clear();      for(int y=0; y<lev.im.size().y; y++)	{	  while(v < lev.vCorners.size() && y > lev.vCorners[v].y)	    v++;	  lev.vCornerRowLUT.push_back(v);	}    };}void KeyFrame::MakeKeyFrame_Rest(){  // Fills the rest of the keyframe structure needed by the mapmaker:  // FAST nonmax suppression, generation of the list of candidates for further map points,  // creation of the relocaliser's SmallBlurryImage.  static gvar3<double> gvdCandidateMinSTScore("MapMaker.CandidateMinShiTomasiScore", 70, SILENT);    // For each level...  for(int l=0; l<LEVELS; l++)    {      Level &lev = aLevels[l];      // .. find those FAST corners which are maximal..      fast_nonmax(lev.im, lev.vCorners, 10, lev.vMaxCorners);      // .. and then calculate the Shi-Tomasi scores of those, and keep the ones with      // a suitably high score as Candidates, i.e. points which the mapmaker will attempt      // to make new map points out of.      for(vector<ImageRef>::iterator i=lev.vMaxCorners.begin(); i!=lev.vMaxCorners.end(); i++)	{	  if(!lev.im.in_image_with_border(*i, 10))	    continue;	  double dSTScore = FindShiTomasiScoreAtPoint(lev.im, 3, *i);	  if(dSTScore > *gvdCandidateMinSTScore)	    {	      Candidate c;	      c.irLevelPos = *i;	      c.dSTScore = dSTScore;	      lev.vCandidates.push_back(c);	    }	}    };    // Also, make a SmallBlurryImage of the keyframe: The relocaliser uses these.  pSBI = new SmallBlurryImage(*this);    // Relocaliser also wants the jacobians..  pSBI->MakeJacs();}// The keyframe struct is quite happy with default operator=, but Level needs its own// to override CVD's reference-counting behaviour.Level& Level::operator=(const Level &rhs){  // Operator= should physically copy pixels, not use CVD's reference-counting image copy.  im.resize(rhs.im.size());  copy(rhs.im, im);    vCorners = rhs.vCorners;  vMaxCorners = rhs.vMaxCorners;  vCornerRowLUT = rhs.vCornerRowLUT;  return *this;}// -------------------------------------------------------------// Some useful globals defined in LevelHelpers.h live here:Vector<3> gavLevelColors[LEVELS];// These globals are filled in here. A single static instance of this struct is run before main()struct LevelHelpersFiller // Code which should be initialised on init goes here; this runs before main(){  LevelHelpersFiller()  {    for(int i=0; i<LEVELS; i++)      {	if(i==0)  gavLevelColors[i] = (make_Vector, 1.0, 0.0, 0.0);	else if(i==1)  gavLevelColors[i] = (make_Vector, 1.0, 1.0, 0.0);	else if(i==2)  gavLevelColors[i] = (make_Vector, 0.0, 1.0, 0.0);	else if(i==3)  gavLevelColors[i] = (make_Vector, 0.0, 0.0, 0.7);	else gavLevelColors[i] =  (make_Vector, 1.0, 1.0, 0.7); // In case I ever run with LEVELS > 4      }  }};static LevelHelpersFiller foo;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -