Я хочу хранить дескрипторы ORB, рассчитанные openCV, в std::bitset<256>
.Как получить дескрипторы ORB из openCV как можно эффективнее?
Как есть несколько дескрипторов на кадр/изображение Я хочу использовать std::vector<std::bitset<256>>
за кадр.
И поскольку в видеоролике есть несколько кадров, в конце используется структура std::vector<std::vector<std::bitset<256>>>
.
Как openCV хранит дескрипторы в cv::Mat
, я спрашиваю себя, как получить дескрипторы как можно быстрее/эффективнее? Итак, я выкопал и нашел answer, который не использует логические операторы, такие как SHIFT
или AND
. Есть ли более быстрый способ?
Возможно, есть лучшая структура на основе 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
'Mat' есть метод' isContinuous() ', если' true', то вы можете получить указатель на исходные данные: 'p = desc.ptr (0)', но не уверен, что это справедливо для нескольких дескрипторов, хранящихся в 'Mat', т. е. дополнении/выравнивании, фактически после просмотра [docs] (http://docs.opencv.org /3.1.0/d3/d63/classcv_1_1Mat.html#aff83775c7fc1479de5f4a8c4e67fe361), это должно правильно сообщать, есть ли пробелы в конце строки –
EdChum