如何使用尽可能少的复制操作将cv :: gpu :: GpuMat行传输到std :: vector?
我能想到的最快的方法是:
GpuMat fooGpu(numRows, numCols, CV_32FC1);
Mat foo = fooGpu;
Mat fooRow = foo.row(i);
std::vector<float> vec;
vec.resize(numCols);
memcpy(&vec[0], fooRow.data, sizeof(float)*numCols);
但我甚至不确定这是否有效,因为fooRow内容必须对齐......
还有其他(更好)的方法吗?
答案 0 :(得分:3)
以下是不产生任何不必要复制的方法:
GpuMat fooGpu(numRows, numCols, CV_32FC1);
std::vector<float> vec;
vec.resize(numCols);
fooGpu.row(i).download(Mat(vec).reshape(1/*channels*/, 1/*rows*/));
答案 1 :(得分:1)
我认为std::copy
更好:
std::vector<float> vec;
vec.resize(numCols);
std::copy(fooRow.data, fooRow.data + numCols, vec.begin());
请注意,第二个参数是:fooRow.data + numCols
,而不是fooRow.data + sizeof(float)* numCols
。
此外,在您的代码中vec.resize(numRows);
似乎不正确。它应该是:
vec.resize(numCols);
因为fooRow
是一行,并且其中包含numCols
个值。
答案 2 :(得分:0)
this帖子可能会回答你的问题。