如何尽可能高效地从 openCV 中获取 ORB 描述符?

Posted

技术标签:

【中文标题】如何尽可能高效地从 openCV 中获取 ORB 描述符?【英文标题】:How to get ORB descriptors out of openCV as efficent as possible? 【发布时间】:2016-09-29 09:34:29 【问题描述】:

我想将 openCV 计算的 ORB 描述符存储到 std::bitset<256> 中。

由于每帧/图像有几个描述符,我想每帧使用std::vector<std::bitset<256>>

由于视频中有多个帧,所以最后使用结构std::vector<std::vector<std::bitset<256>>>

当 openCV 将描述符存储到 cv::Mat 时,我在问自己如何尽可能快/有效地从中获取描述符?所以我四处挖掘,发现了一个answer,它不使用像SHIFTAND 这样的逻辑运算符。有没有更快的方法?

也许有一个更好的基于std as std::vector<std::vector<std::bitset<256>>> 的结构来加速它?

为了更容易理解问题,这里有一小段代码。

#include <iostream>
#include <vector>
#include <bitset>
#include <opencv2/opencv.hpp>

int main(int argc, char ** argv)

  // opencv
  cv::Mat color, gray, descs;

  std::vector<cv::KeyPoint> kpts;

  cv::Ptr<cv::ORB> detector = cv::ORB::create();

  cv::VideoCapture video(argv[1]);

  // my desired datastruct
  using my_desc_t = std::bitset<256>; // one descriptor

  using my_frame_t = std::vector<my_desc_t>; // one frame

  using my_video_t = std::vector<my_frame_t>; // one video

  my_video_t my_video;

  my_video.resize(video.get(CV_CAP_PROP_FRAME_COUNT));

  // processing
  for (size_t i=0,j=video.get(CV_CAP_PROP_FRAME_COUNT); i!=j; ++i)
  
    if (video.read(color))
    
      // detect and compute
      cv::cvtColor(color,gray,CV_BGR2GRAY);
      detector->detectAndCompute(gray,cv::Mat(),kpts,descs);

      // fill
      // TODO

      // 8 (uchar) * 32 = 256 bits each orb descriptor.
      // how to use logical operators to copy it
      // as fast as possible into my_video?
    
  

我用clang++ -std=c++11 experiment.cpp -o experiment -lopencv_core -lopencv_imgproc -lopencv_videoio -lopencv_features2d编译它

【问题讨论】:

Mat 有方法isContinuous() 如果true 那么你可以获得指向原始数据的指针:p = desc.ptr&lt;uchar&gt;(0) 但不确定这是否适用于存储在Mat 中的多个描述符,即填充/对齐,实际上在查看docs 之后,这应该正确报告行尾是否有任何间隙 【参考方案1】:

这就是答案

// bitset to Mat:

std::bitset<256> bs(11); // some demo value
Mat m(1,32,CV_8U, reinterpret_cast<uchar*>(&bs)); // 32 bytes

cerr << bs << endl;
cerr << m  << endl;

// Mat to bitset

std::bitset<256> bs2;
memcpy(&bs2, m.data, 32);

cerr << bs2 << endl;

【讨论】:

以上是关于如何尽可能高效地从 openCV 中获取 ORB 描述符?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV特征点检测——ORB特征

OpenCV ORB 特征检测器如何工作?

如何高效地从多个表中查询子记录?

使用ORB在OpenCV中生成密集视差图

ORB算法与opencv实现

ORB算法与opencv实现