2016-09-29 1 views
1

openCVで計算されたORBディスクリプタをstd::bitset<256>に保存します。openCVからORB記述子をできるだけ効率的に取得するにはどうすればよいですか?

フレーム/イメージごとに複数のディスクリプタがあるので、フレームあたりstd::vector<std::bitset<256>>を使用します。

ビデオに複数のフレームがあるため、最後に構造std::vector<std::vector<std::bitset<256>>>が使用されます。

openCVはdesc35をcv::Matに保存するので、できるだけ早く/効率的にディスクリプタを取得する方法について質問していますか?だから私は周りを掘り、SHIFTまたはANDのような論理演算子を使用しないanswerを見つけた。より速い方法がありますか?

stdに基づいたより良い構造体がありますか?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

+0

'Mat')はメソッド' isContinuousを(持っている '、あなたは生データへのポインタを取得することができますは' true'場合: 'p = desc.ptr (0)'しかし、実際には[docs](http://docs.opencv.org)を見て、これが 'Mat'に格納されている複数の記述子、すなわちパディング/ /3.1.0/d3/d63/classcv_1_1Mat.html#aff83775c7fc1479de5f4a8c4e67fe361)これはギャップがあるかどうかを正確に報告するはずです行末に – EdChum

答えて

0

でコンパイル

// 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; 
関連する問題