繁体   English   中英

将GpuMat行复制到std :: vector

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM