SLProject  4.2.000
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
CVRaulMurOrb Class Reference

Orb detector and descriptor with distribution. More...

#include <CVRaulMurOrb.h>

Inherits CVFeature2D.

Public Types

enum  { HARRIS_SCORE = 0 , FAST_SCORE = 1 }
 

Public Member Functions

 CVRaulMurOrb (int nfeatures, float scaleFactor, int nlevels, int iniThFAST, int minThFAST)
 
void detectAndCompute (CVInputArray image, CVInputArray mask, CVVKeyPoint &keypoints, CVOutputArray descriptors, bool useProvidedKeypoints)
 
uint GetLevels ()
 
float GetScaleFactor ()
 
vector< float > GetScaleFactors ()
 
vector< float > GetInverseScaleFactors ()
 
vector< float > GetScaleSigmaSquares ()
 
vector< float > GetInverseScaleSigmaSquares ()
 

Public Attributes

CVVMat mvImagePyramid
 

Protected Member Functions

void ComputePyramid (CVMat image)
 
void ComputeKeyPointsOctTree (CVVVKeyPoint &allKeypoints)
 Get the Keypoints and distribute them. More...
 
CVVKeyPoint DistributeOctTree (const CVVKeyPoint &vToDistributeKeys, const int &minX, const int &maxX, const int &minY, const int &maxY, const int &nFeatures, const int &level)
 Create The tree and distribute it. More...
 

Protected Attributes

CVVPoint pattern
 
int nfeatures
 
double scaleFactor
 
uint nlevels
 
int iniThFAST
 
int minThFAST
 
vector< int > mnFeaturesPerLevel
 
vector< int > umax
 
vector< float > mvScaleFactor
 
vector< float > mvInvScaleFactor
 
vector< float > mvLevelSigma2
 
vector< float > mvInvLevelSigma2
 

Detailed Description

Orb detector and descriptor with distribution.

Definition at line 20 of file CVRaulMurOrb.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
HARRIS_SCORE 
FAST_SCORE 

Definition at line 23 of file CVRaulMurOrb.h.

24  {
25  HARRIS_SCORE = 0,
26  FAST_SCORE = 1
27  };

Constructor & Destructor Documentation

◆ CVRaulMurOrb()

CVRaulMurOrb::CVRaulMurOrb ( int  nfeatures,
float  scaleFactor,
int  nlevels,
int  iniThFAST,
int  minThFAST 
)

Definition at line 365 of file CVRaulMurOrb.cpp.

370  : nfeatures(_nfeatures),
371  scaleFactor(_scaleFactor),
372  nlevels((uint)_nlevels),
373  iniThFAST(_iniThFAST),
374  minThFAST(_minThFAST)
375 
376 {
377  mvScaleFactor.resize(nlevels);
378  mvLevelSigma2.resize(nlevels);
379  mvScaleFactor[0] = 1.0f;
380  mvLevelSigma2[0] = 1.0f;
381  for (uint i = 1; i < nlevels; i++)
382  {
383  mvScaleFactor[i] = mvScaleFactor[i - 1] * (float)scaleFactor;
385  }
386 
387  mvInvScaleFactor.resize(nlevels);
388  mvInvLevelSigma2.resize(nlevels);
389  for (uint i = 0; i < nlevels; i++)
390  {
391  mvInvScaleFactor[i] = 1.0f / mvScaleFactor[i];
392  mvInvLevelSigma2[i] = 1.0f / mvLevelSigma2[i];
393  }
394 
395  mvImagePyramid.resize(nlevels);
396 
397  mnFeaturesPerLevel.resize(nlevels);
398  float factor = 1.0f / (float)scaleFactor;
399  float nDesiredFeaturesPerScale = nfeatures * (1 - factor) / (1 - (float)pow((double)factor, (double)nlevels));
400 
401  int sumFeatures = 0;
402  for (uint level = 0; level < nlevels - 1; level++)
403  {
404  mnFeaturesPerLevel[level] = cvRound(nDesiredFeaturesPerScale);
405  sumFeatures += mnFeaturesPerLevel[level];
406  nDesiredFeaturesPerScale *= factor;
407  }
408  mnFeaturesPerLevel[nlevels - 1] = std::max(nfeatures - sumFeatures, 0);
409 
410  const int npoints = 512;
411  const CVPoint* pattern0 = (const CVPoint*)bit_pattern_31_;
412  std::copy(pattern0, pattern0 + npoints, std::back_inserter(pattern));
413 
414  // This is for orientation
415  // pre-compute the end of a row in a circular patch
416  umax.resize(HALF_PATCH_SIZE + 1);
417 
418  int v, v0, vmax = cvFloor(HALF_PATCH_SIZE * sqrt(2.f) / 2 + 1);
419  int vmin = cvCeil(HALF_PATCH_SIZE * sqrt(2.f) / 2);
420  const double hp2 = HALF_PATCH_SIZE * HALF_PATCH_SIZE;
421 
422  for (v = 0; v <= vmax; ++v)
423  umax[(uint)v] = cvRound(sqrt(hp2 - v * v));
424 
425  // Make sure we are symmetric
426  for (v = HALF_PATCH_SIZE, v0 = 0; v >= vmin; --v)
427  {
428  while (umax[(uint)v0] == umax[(uint)v0 + 1])
429  ++v0;
430  umax[(uint)v] = v0;
431  ++v0;
432  }
433 }
const int HALF_PATCH_SIZE
static int bit_pattern_31_[256 *4]
cv::Point CVPoint
Definition: CVTypedefs.h:41
vector< int > umax
Definition: CVRaulMurOrb.h:70
vector< float > mvInvLevelSigma2
Definition: CVRaulMurOrb.h:74
vector< float > mvInvScaleFactor
Definition: CVRaulMurOrb.h:72
CVVPoint pattern
Definition: CVRaulMurOrb.h:63
vector< int > mnFeaturesPerLevel
Definition: CVRaulMurOrb.h:69
double scaleFactor
Definition: CVRaulMurOrb.h:65
vector< float > mvLevelSigma2
Definition: CVRaulMurOrb.h:73
vector< float > mvScaleFactor
Definition: CVRaulMurOrb.h:71
CVVMat mvImagePyramid
Definition: CVRaulMurOrb.h:51

Member Function Documentation

◆ ComputeKeyPointsOctTree()

void CVRaulMurOrb::ComputeKeyPointsOctTree ( CVVVKeyPoint allKeypoints)
protected

Get the Keypoints and distribute them.

Definition at line 682 of file CVRaulMurOrb.cpp.

683 {
684  const float W = 30;
685 
686  for (uint level = 0; level < nlevels; ++level)
687  {
688  const int minBorderX = EDGE_THRESHOLD - 3;
689  const int minBorderY = minBorderX;
690  const int maxBorderX = mvImagePyramid[level].cols - EDGE_THRESHOLD + 3;
691  const int maxBorderY = mvImagePyramid[level].rows - EDGE_THRESHOLD + 3;
692 
693  CVVKeyPoint vToDistributeKeys;
694  vToDistributeKeys.reserve((uint)nfeatures * 10);
695 
696  const float width = (float)(maxBorderX - minBorderX);
697  const float height = (float)(maxBorderY - minBorderY);
698 
699  // generate the Cells to look for features in
700  const int nCols = (int)(width / W);
701  const int nRows = (int)(height / W);
702  const int wCell = (int)(ceil(width / nCols));
703  const int hCell = (int)(ceil(height / nRows));
704 
705  for (int i = 0; i < nRows; i++)
706  {
707  const float iniY = (float)(minBorderY + i * hCell);
708  float maxY = iniY + hCell + 6;
709 
710  if (iniY >= maxBorderY - 3)
711  continue;
712  if (maxY > maxBorderY)
713  maxY = (float)maxBorderY;
714 
715  for (int j = 0; j < nCols; j++)
716  {
717  const float iniX = (float)(minBorderX + j * wCell);
718  float maxX = iniX + wCell + 6;
719  if (iniX >= maxBorderX - 6)
720  continue;
721  if (maxX > maxBorderX)
722  maxX = (float)maxBorderX;
723 
724  CVVKeyPoint vKeysCell;
725 
726  // Try to get Keypoints with initial Threshold
727 
728  FAST(mvImagePyramid[level]
729  .rowRange((int)iniY, (int)maxY)
730  .colRange((int)iniX, (int)maxX),
731  vKeysCell,
732  iniThFAST,
733  true);
734 
735  // If no Keypoints are found try again with a lower Threshold
736  if (vKeysCell.empty())
737  {
738  FAST(mvImagePyramid[level]
739  .rowRange((int)iniY, (int)maxY)
740  .colRange((int)iniX, (int)maxX),
741  vKeysCell,
742  minThFAST,
743  true);
744  }
745 
746  if (!vKeysCell.empty())
747  {
748  for (CVVKeyPoint::iterator vit = vKeysCell.begin(); vit != vKeysCell.end(); vit++)
749  {
750  (*vit).pt.x += j * wCell;
751  (*vit).pt.y += i * hCell;
752  vToDistributeKeys.push_back(*vit);
753  }
754  }
755  }
756  }
757 
758  CVVKeyPoint& keypoints = allKeypoints[level];
759  keypoints.reserve((uint)nfeatures);
760 
761  keypoints = DistributeOctTree(vToDistributeKeys,
762  minBorderX,
763  maxBorderX,
764  minBorderY,
765  maxBorderY,
766  mnFeaturesPerLevel[level],
767  (int)level);
768 
769  const int scaledPatchSize = (int)(PATCH_SIZE * mvScaleFactor[level]);
770 
771  // Add border to coordinates and scale information
772  const int nkps = (int)keypoints.size();
773  for (uint i = 0; i < (uint)nkps; i++)
774  {
775  keypoints[i].pt.x += minBorderX;
776  keypoints[i].pt.y += minBorderY;
777  keypoints[i].octave = (int)level;
778  keypoints[i].size = (float)scaledPatchSize;
779  }
780  }
781 
782  // compute orientations
783 
784  for (uint level = 0; level < nlevels; ++level)
785  computeOrientation(mvImagePyramid[level], allKeypoints[level], umax);
786 }
const int EDGE_THRESHOLD
const int PATCH_SIZE
static void computeOrientation(const CVMat &image, CVVKeyPoint &keypoints, const vector< int > &umax)
Compute the angle for a keypoint and save it.
vector< cv::KeyPoint > CVVKeyPoint
Definition: CVTypedefs.h:88
CVVKeyPoint DistributeOctTree(const CVVKeyPoint &vToDistributeKeys, const int &minX, const int &maxX, const int &minY, const int &maxY, const int &nFeatures, const int &level)
Create The tree and distribute it.
T ceil(T a)
Definition: Utils.h:247

◆ ComputePyramid()

void CVRaulMurOrb::ComputePyramid ( CVMat  image)
protected

Definition at line 900 of file CVRaulMurOrb.cpp.

901 {
902  for (uint level = 0; level < (uint)nlevels; ++level)
903  {
904  float scale = mvInvScaleFactor[level];
905  CVSize sz(cvRound((float)image.cols * scale),
906  cvRound((float)image.rows * scale));
907  CVSize wholeSize(sz.width + EDGE_THRESHOLD * 2,
908  sz.height + EDGE_THRESHOLD * 2);
909  CVMat temp(wholeSize, image.type()), masktemp;
910 
911  mvImagePyramid[level] = temp(CVRect(EDGE_THRESHOLD,
913  sz.width,
914  sz.height));
915 
916  // Compute the resized image
917  if (level != 0)
918  {
919  resize(mvImagePyramid[level - 1],
920  mvImagePyramid[level],
921  sz,
922  0,
923  0,
924  INTER_LINEAR);
925 
926  copyMakeBorder(mvImagePyramid[level],
927  temp,
932  BORDER_REFLECT_101 + BORDER_ISOLATED);
933  }
934  else
935  {
936  copyMakeBorder(image, temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, BORDER_REFLECT_101);
937  }
938  }
939 
940  // save image pyriamid
941  /*for (int level = 0; level < nlevels; ++level) {
942  string filename = "D:/Development/SLProject/debug_ouput/imagePyriamid" + to_string(level) + ".jpg";
943  cv::imwrite(filename, mvImagePyramid[level]);
944  }*/
945 }
cv::Rect CVRect
Definition: CVTypedefs.h:39
cv::Size CVSize
Definition: CVTypedefs.h:55
cv::Mat CVMat
Definition: CVTypedefs.h:38

◆ detectAndCompute()

void CVRaulMurOrb::detectAndCompute ( CVInputArray  _image,
CVInputArray  _mask,
CVVKeyPoint _keypoints,
CVOutputArray  _descriptors,
bool  useProvidedKeypoints 
)

Main detection function. Can be seperated if predefined keypoints are given or no descriptor array is given.

Remove Points from image border. Ensures that ORB_SLAM and ORB generate the same descriptors from the same keypoints.

Definition at line 810 of file CVRaulMurOrb.cpp.

815 {
816  if (_image.empty())
817  return;
818 
819  CVMat image = _image.getMat();
820  assert(image.type() == CV_8UC1);
821 
822  // Pre-compute the scale pyramid
823  ComputePyramid(image);
824  CVMat descriptors;
825  CVVVKeyPoint allKeypoints;
826  allKeypoints.resize(nlevels);
827  int nkeypoints = 0;
828  if (!useProvidedKeypoints)
829  {
830  ComputeKeyPointsOctTree(allKeypoints);
831  // ComputeKeyPointsOld(allKeypoints);
832  for (uint level = 0; level < nlevels; ++level)
833  nkeypoints += (int)allKeypoints[level].size();
834  _keypoints.clear();
835  _keypoints.reserve((uint)nkeypoints);
836  }
837  else
838  {
839  //! Remove Points from image border. Ensures that ORB_SLAM and ORB
840  //! generate the same descriptors from the same keypoints.
841  KeyPointsFilter::runByImageBorder(_keypoints, _image.size(), 31);
842  nkeypoints = (int)_keypoints.size();
843  int last_level = 0;
844  for (uint index = 0; index < _keypoints.size(); index++)
845  {
846  if (_keypoints[index].octave > last_level)
847  last_level = _keypoints[index].octave;
848 
849  _keypoints[index].pt /= mvScaleFactor[(uint)_keypoints[index].octave];
850  allKeypoints[(uint)_keypoints[index].octave].push_back(_keypoints[index]);
851  }
852  }
853  if (nkeypoints == 0)
854  _descriptors.release();
855  else if (_descriptors.needed())
856  {
857  _descriptors.create(nkeypoints, 32, CV_8U);
858  descriptors = _descriptors.getMat();
859  }
860 
861  int offset = 0;
862  for (uint level = 0; level < nlevels; ++level)
863  {
864  CVVKeyPoint& keypoints = allKeypoints[level];
865  int nkeypointsLevel = (int)keypoints.size();
866 
867  if (nkeypointsLevel == 0)
868  continue;
869  if (_descriptors.needed())
870  {
871  // preprocess the resized image
872  CVMat workingMat = mvImagePyramid[level].clone();
873  GaussianBlur(workingMat, workingMat, cv::Size(7, 7), 2, 2, BORDER_REFLECT_101);
874 
875  // Compute the descriptors
876  CVMat desc = descriptors.rowRange(offset, offset + nkeypointsLevel);
877 
878  computeDescriptors(workingMat, keypoints, desc, pattern);
879  }
880  offset += nkeypointsLevel;
881 
882  // Scale keypoint coordinates
883  if (level != 0)
884  {
885  float scale = mvScaleFactor[level]; // getScale(level, firstLevel, scaleFactor);
886  for (CVVKeyPoint::iterator keypoint = keypoints.begin(),
887  keypointEnd = keypoints.end();
888  keypoint != keypointEnd;
889  ++keypoint)
890  keypoint->pt *= scale;
891  }
892  // And add the keypoints to the output
893  if (!useProvidedKeypoints)
894  {
895  _keypoints.insert(_keypoints.end(), keypoints.begin(), keypoints.end());
896  }
897  }
898 }
static void computeDescriptors(const CVMat &image, CVVKeyPoint &keypoints, CVMat &descriptors, CVVPoint &pattern)
Computes the descriptors for all passed keypoints.
vector< vector< cv::KeyPoint > > CVVVKeyPoint
Definition: CVTypedefs.h:102
void ComputePyramid(CVMat image)
void ComputeKeyPointsOctTree(CVVVKeyPoint &allKeypoints)
Get the Keypoints and distribute them.

◆ DistributeOctTree()

CVVKeyPoint CVRaulMurOrb::DistributeOctTree ( const CVVKeyPoint vToDistributeKeys,
const int &  minX,
const int &  maxX,
const int &  minY,
const int &  maxY,
const int &  nFeatures,
const int &  level 
)
protected

Create The tree and distribute it.

Check if the nodes are empty and erase them if not

Definition at line 450 of file CVRaulMurOrb.cpp.

457 {
458  // Compute how many initial nodes
459  const int nIni = (int)round(static_cast<float>(maxX - minX) / (maxY - minY));
460 
461  const float hX = static_cast<float>(maxX - minX) / nIni;
462 
463  list<CVRaulMurExtNode> lNodes;
464 
465  vector<CVRaulMurExtNode*> vpIniNodes;
466  vpIniNodes.resize((uint)nIni);
467 
468  for (int i = 0; i < nIni; i++)
469  {
470  CVRaulMurExtNode ni;
471  // upperleft
472  ni.UL = CVPoint2i((int)(hX * (float)(i)), 0);
473  // upperright
474  ni.UR = CVPoint2i((int)(hX * (float)(i + 1)), 0);
475  // bottomleft
476  ni.BL = CVPoint2i(ni.UL.x, maxY - minY);
477  // bottomright
478  ni.BR = CVPoint2i(ni.UR.x, maxY - minY);
479  ni.vKeys.reserve(vToDistributeKeys.size());
480 
481  lNodes.push_back(ni);
482  vpIniNodes[(uint)i] = &lNodes.back();
483  }
484 
485  // Associate points to childs
486  for (size_t i = 0; i < vToDistributeKeys.size(); i++)
487  {
488  const CVKeyPoint& kp = vToDistributeKeys[i];
489  vpIniNodes[(uint)(kp.pt.x / hX)]->vKeys.push_back(kp);
490  }
491 
492  list<CVRaulMurExtNode>::iterator lit = lNodes.begin();
493  //! Check if the nodes are empty and erase them if not
494  while (lit != lNodes.end())
495  {
496  if (lit->vKeys.size() == 1)
497  {
498  lit->bNoMore = true;
499  lit++;
500  }
501  else if (lit->vKeys.empty())
502  lit = lNodes.erase(lit);
503  else
504  lit++;
505  }
506 
507  bool bFinish = false;
508 
509  int iteration = 0;
510 
511  vector<pair<int, CVRaulMurExtNode*>> vSizeAndPointerToNode;
512  vSizeAndPointerToNode.reserve(lNodes.size() * 4);
513 
514  while (!bFinish)
515  {
516  int prevSize = (int)lNodes.size();
517 
518  lit = lNodes.begin();
519 
520  int nToExpand = 0;
521 
522  vSizeAndPointerToNode.clear();
523 
524  while (lit != lNodes.end())
525  {
526  if (lit->bNoMore)
527  {
528  // If node only contains one point do not subdivide and continue
529  lit++;
530  continue;
531  }
532  else
533  {
534  // If more than one point, subdivide
535  CVRaulMurExtNode n1, n2, n3, n4;
536  lit->DivideNode(n1, n2, n3, n4);
537 
538  // Add children if they contain points
539  if (!n1.vKeys.empty())
540  {
541  lNodes.push_front(n1);
542  if (!n1.vKeys.empty())
543  {
544  nToExpand++;
545  vSizeAndPointerToNode.push_back(std::make_pair(n1.vKeys.size(), &lNodes.front()));
546  lNodes.front().lit = lNodes.begin();
547  }
548  }
549  if (!n2.vKeys.empty())
550  {
551  lNodes.push_front(n2);
552  if (n2.vKeys.size() > 1)
553  {
554  nToExpand++;
555  vSizeAndPointerToNode.push_back(std::make_pair(n2.vKeys.size(), &lNodes.front()));
556  lNodes.front().lit = lNodes.begin();
557  }
558  }
559  if (!n3.vKeys.empty())
560  {
561  lNodes.push_front(n3);
562  if (n3.vKeys.size() > 1)
563  {
564  nToExpand++;
565  vSizeAndPointerToNode.push_back(std::make_pair(n3.vKeys.size(), &lNodes.front()));
566  lNodes.front().lit = lNodes.begin();
567  }
568  }
569  if (!n4.vKeys.empty())
570  {
571  lNodes.push_front(n4);
572  if (n4.vKeys.size() > 1)
573  {
574  nToExpand++;
575  vSizeAndPointerToNode.push_back(std::make_pair(n4.vKeys.size(), &lNodes.front()));
576  lNodes.front().lit = lNodes.begin();
577  }
578  }
579 
580  lit = lNodes.erase(lit);
581  continue;
582  }
583  }
584 
585  // Finish if there are more nodes than required features
586  // or all nodes contain just one point
587 
588  if ((int)lNodes.size() >= N || (int)lNodes.size() == prevSize)
589  {
590  bFinish = true;
591  }
592  else if (((int)lNodes.size() + nToExpand * 3) > N)
593  {
594  while (!bFinish)
595  {
596  prevSize = (int)lNodes.size();
597 
598  vector<pair<int, CVRaulMurExtNode*>> vPrevSizeAndPointerToNode = vSizeAndPointerToNode;
599  vSizeAndPointerToNode.clear();
600 
601  sort(vPrevSizeAndPointerToNode.begin(), vPrevSizeAndPointerToNode.end());
602  for (int j = (int)vPrevSizeAndPointerToNode.size() - 1; j >= 0; j--)
603  {
604  CVRaulMurExtNode n1, n2, n3, n4;
605  vPrevSizeAndPointerToNode[(uint)j].second->DivideNode(n1, n2, n3, n4);
606 
607  // Add childs if they contain points
608  if (!n1.vKeys.empty())
609  {
610  lNodes.push_front(n1);
611  if (n1.vKeys.size() > 1)
612  {
613  vSizeAndPointerToNode.push_back(std::make_pair(n1.vKeys.size(), &lNodes.front()));
614  lNodes.front().lit = lNodes.begin();
615  }
616  }
617  if (!n2.vKeys.empty())
618  {
619  lNodes.push_front(n2);
620  if (n2.vKeys.size() > 1)
621  {
622  vSizeAndPointerToNode.push_back(std::make_pair(n2.vKeys.size(), &lNodes.front()));
623  lNodes.front().lit = lNodes.begin();
624  }
625  }
626  if (!n3.vKeys.empty())
627  {
628  lNodes.push_front(n3);
629  if (n3.vKeys.size() > 1)
630  {
631  vSizeAndPointerToNode.push_back(std::make_pair(n3.vKeys.size(), &lNodes.front()));
632  lNodes.front().lit = lNodes.begin();
633  }
634  }
635  if (!n4.vKeys.empty())
636  {
637  lNodes.push_front(n4);
638  if (n4.vKeys.size() > 1)
639  {
640  vSizeAndPointerToNode.push_back(std::make_pair(n4.vKeys.size(), &lNodes.front()));
641  lNodes.front().lit = lNodes.begin();
642  }
643  }
644 
645  lNodes.erase(vPrevSizeAndPointerToNode[(uint)j].second->lit);
646 
647  if ((int)lNodes.size() >= N)
648  break;
649  }
650 
651  if ((int)lNodes.size() >= N || (int)lNodes.size() == prevSize)
652  bFinish = true;
653  }
654  }
655  }
656 
657  // Retain the best point in each node
658  CVVKeyPoint vResultKeys;
659  vResultKeys.reserve((uint)nfeatures);
660  for (list<CVRaulMurExtNode>::iterator lit = lNodes.begin(); lit != lNodes.end(); lit++)
661  {
662  CVVKeyPoint& vNodeKeys = lit->vKeys;
663  CVKeyPoint* pKP = &vNodeKeys[0];
664  float maxResponse = pKP->response;
665 
666  for (size_t k = 1; k < vNodeKeys.size(); k++)
667  {
668  if (vNodeKeys[k].response > maxResponse)
669  {
670  pKP = &vNodeKeys[k];
671  maxResponse = vNodeKeys[k].response;
672  }
673  }
674 
675  vResultKeys.push_back(*pKP);
676  }
677 
678  return vResultKeys;
679 }
cv::Point2i CVPoint2i
Definition: CVTypedefs.h:42
cv::KeyPoint CVKeyPoint
Definition: CVTypedefs.h:60
Data structure used to subdivide the Image with key points into segments.
void DivideNode(CVRaulMurExtNode &n1, CVRaulMurExtNode &n2, CVRaulMurExtNode &n3, CVRaulMurExtNode &n4)

◆ GetInverseScaleFactors()

vector<float> CVRaulMurOrb::GetInverseScaleFactors ( )
inline

Definition at line 47 of file CVRaulMurOrb.h.

47 { return mvInvScaleFactor; }

◆ GetInverseScaleSigmaSquares()

vector<float> CVRaulMurOrb::GetInverseScaleSigmaSquares ( )
inline

Definition at line 49 of file CVRaulMurOrb.h.

49 { return mvInvLevelSigma2; }

◆ GetLevels()

uint CVRaulMurOrb::GetLevels ( )
inline

Definition at line 44 of file CVRaulMurOrb.h.

44 { return nlevels; }

◆ GetScaleFactor()

float CVRaulMurOrb::GetScaleFactor ( )
inline

Definition at line 45 of file CVRaulMurOrb.h.

45 { return (float)scaleFactor; }

◆ GetScaleFactors()

vector<float> CVRaulMurOrb::GetScaleFactors ( )
inline

Definition at line 46 of file CVRaulMurOrb.h.

46 { return mvScaleFactor; }

◆ GetScaleSigmaSquares()

vector<float> CVRaulMurOrb::GetScaleSigmaSquares ( )
inline

Definition at line 48 of file CVRaulMurOrb.h.

48 { return mvLevelSigma2; }

Member Data Documentation

◆ iniThFAST

int CVRaulMurOrb::iniThFAST
protected

Definition at line 67 of file CVRaulMurOrb.h.

◆ minThFAST

int CVRaulMurOrb::minThFAST
protected

Definition at line 68 of file CVRaulMurOrb.h.

◆ mnFeaturesPerLevel

vector<int> CVRaulMurOrb::mnFeaturesPerLevel
protected

Definition at line 69 of file CVRaulMurOrb.h.

◆ mvImagePyramid

CVVMat CVRaulMurOrb::mvImagePyramid

Definition at line 51 of file CVRaulMurOrb.h.

◆ mvInvLevelSigma2

vector<float> CVRaulMurOrb::mvInvLevelSigma2
protected

Definition at line 74 of file CVRaulMurOrb.h.

◆ mvInvScaleFactor

vector<float> CVRaulMurOrb::mvInvScaleFactor
protected

Definition at line 72 of file CVRaulMurOrb.h.

◆ mvLevelSigma2

vector<float> CVRaulMurOrb::mvLevelSigma2
protected

Definition at line 73 of file CVRaulMurOrb.h.

◆ mvScaleFactor

vector<float> CVRaulMurOrb::mvScaleFactor
protected

Definition at line 71 of file CVRaulMurOrb.h.

◆ nfeatures

int CVRaulMurOrb::nfeatures
protected

Definition at line 64 of file CVRaulMurOrb.h.

◆ nlevels

uint CVRaulMurOrb::nlevels
protected

Definition at line 66 of file CVRaulMurOrb.h.

◆ pattern

CVVPoint CVRaulMurOrb::pattern
protected

Definition at line 63 of file CVRaulMurOrb.h.

◆ scaleFactor

double CVRaulMurOrb::scaleFactor
protected

Definition at line 65 of file CVRaulMurOrb.h.

◆ umax

vector<int> CVRaulMurOrb::umax
protected

Definition at line 70 of file CVRaulMurOrb.h.


The documentation for this class was generated from the following files: