Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将GpuMat行复制到std::vector_C++_Opencv_Copy_Gpu_Stdvector - Fatal编程技术网

C++ 将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

如何使用尽可能少的复制操作将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);
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列。但我认为这个案件是一个错误,我将提交一张罚单。