Копирование строки GpuMat в std :: vector - PullRequest
1 голос
/ 20 сентября 2011

Как я могу перенести строки 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 ]

3 голосов
/ 20 сентября 2011

Вот метод, который не производит ненужного копирования:

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 голос
/ 20 сентября 2011

Я думаю 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 количество значений в ней.

0 голосов
/ 02 мая 2013

Возможно эта запись может ответить на ваш вопрос.

...