将GpuMat行复制到std :: vector

时间:2011-09-20 12:00:41

标签: c++ opencv copy gpu stdvector

如何使用尽可能少的复制操作将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内容必须对齐......

还有其他(更好)的方法吗?

3 个答案:

答案 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帖子可能会回答你的问题。