[英]Copying a GpuMat row to a std::vector
如何使用尽可能少的复制操作将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内容必须对齐......
还有另外(更好)的方法吗?
这是不会产生任何不必要的复制的方法:
GpuMat fooGpu(numRows, numCols, CV_32FC1);
std::vector<float> vec;
vec.resize(numCols);
fooGpu.row(i).download(Mat(vec).reshape(1/*channels*/, 1/*rows*/));
我认为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
数量的值。
可能这篇文章可能会回答你的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.