C++ 将GpuMat行复制到std::vector
如何使用尽可能少的复制操作将cv::gpu::GpuMat行传输到std::vector 我能想到的最快方法是:C++ 将GpuMat行复制到std::vector,c++,opencv,copy,gpu,stdvector,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)*numCol
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);
GpuMat fooGpu(numRows、numCols、CV_32FC1);
Mat foo=fooGpu;
Mat foorw=foo.row(i);
std::vec;
调整向量大小(numCols);
memcpy(&vec[0],fooRow.data,sizeof(float)*numCols);
但我甚至不确定这是否有效,因为fooRow内容必须对齐
还有其他(更好的)方法吗?我认为
std::copy
更好:
std::vector<float> vec;
vec.resize(numCols);
std::copy(fooRow.data, fooRow.data + numCols, vec.begin());
因为
fooRow
是一行,其中有numCols
个值。我认为std::copy
更好:
std::vector<float> vec;
vec.resize(numCols);
std::copy(fooRow.data, fooRow.data + numCols, vec.begin());
因为
fooRow
是一行,并且其中有numCols
个值。以下是不产生任何不必要复制的方法:
GpuMat fooGpu(numRows, numCols, CV_32FC1);
std::vector<float> vec;
vec.resize(numCols);
fooGpu.row(i).download(Mat(vec).reshape(1/*channels*/, 1/*rows*/));
GpuMat fooGpu(numRows、numCols、CV_32FC1);
std::vec;
调整向量大小(numCols);
下载(Mat(vec).重塑(1/*通道*/,1/*行*/);
以下是不会产生任何不必要复制的方法:
GpuMat fooGpu(numRows, numCols, CV_32FC1);
std::vector<float> vec;
vec.resize(numCols);
fooGpu.row(i).download(Mat(vec).reshape(1/*channels*/, 1/*rows*/));
GpuMat fooGpu(numRows、numCols、CV_32FC1);
std::vec;
调整向量大小(numCols);
下载(Mat(vec).重塑(1/*通道*/,1/*行*/);
可能post可以回答您的问题。可能post可以回答您的问题。使用背面插入器
可能不需要调整大小,并且调整大小的值会分摊到O(1),但我认为保留大小并不是一个坏主意,因为您知道大小。虽然喜欢干净的代码而不是过早优化的代码是个好主意,但我们不应该给我们比现在更愚蠢的东西。你当然是对的。。。而且你的代码看起来更好。但我仍然想知道是否可以直接访问GpuMat数据。如果没有:我可以假设foorw数据是对齐的吗?@Nawaz但是现在你有了一个调整大小
和一个反向插入器
。使用reserve
或vec.begin()
。使用back\u inserter
,可能不需要调整大小,而且调整大小会分摊到O(1),但我认为保留大小不是个坏主意,因为您知道大小。虽然喜欢干净的代码而不是过早优化的代码是个好主意,但我们不应该给我们比现在更愚蠢的东西。你当然是对的。。。而且你的代码看起来更好。但我仍然想知道是否可以直接访问GpuMat数据。如果没有:我可以假设foorw数据是对齐的吗?@Nawaz但是现在你有了一个调整大小
和一个反向插入器
。使用reserve
或vec.begin()
。谢谢!这正是我想要的:)不,对不起。我测试了它,但它不起作用。Mat(vec)使用vec作为初始化值,但似乎没有指向vec的数据,因为下载后,vec仍然充满了零。matm;fooGpu.row(i).下载(m);vec=m;工作正常,但这又涉及到复制。我很确定Mat(vec)
共享向量数据,但必须为向量分配正确的长度(vec.resize(numCols);
是必需的)。如果这段代码不起作用,那么这是一个OpenCV错误,应该在OpenCV bugtracker上报告。你是对的。但是download()方法似乎重新分配了内存。我找到了问题的根源并更新了答案:默认情况下,向量转换为Mat,具有vec.size()
行和1列。但我认为这个案件是一个错误,我将提交一张罚单。谢谢!这正是我想要的:)不,对不起。我测试了它,但它不起作用。Mat(vec)使用vec作为初始化值,但似乎没有指向vec的数据,因为下载后,vec仍然充满了零。matm;fooGpu.row(i).下载(m);vec=m;工作正常,但这又涉及到复制。我很确定Mat(vec)
共享向量数据,但必须为向量分配正确的长度(vec.resize(numCols);
是必需的)。如果这段代码不起作用,那么这是一个OpenCV错误,应该在OpenCV bugtracker上报告。你是对的。但是download()方法似乎重新分配了内存。我找到了问题的根源并更新了答案:默认情况下,向量转换为Mat,具有vec.size()
行和1列。但我认为这个案件是一个错误,我将提交一张罚单。