эффективный способ создать мат opencv из std :: vector - PullRequest
0 голосов
/ 05 мая 2018

Если я хочу создать мат opencv из std :: vector, я использую следующую функцию:

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)

vector<double> myData;
cv::Mat m(100, 100, 1, myData.data(), myData.size())

Этот конструктор не копирует данные, поэтому, когда вектор является временным, и мы возвращаем мат, у него есть недопустимые данные, поэтому я возвращаю их клон, который неэффективен.

void doProcessing()
{
  //...
  Mat m = getMat(12.2, 144, ...);
  cout<< m.at<double>(0,0);
  //...
}

Mat getMat(some parameters){
  vector<double> myData;
  //do some processing on parameters and myData
  cv::Mat m(100, 100, 1, myData.data(), myData.size());
  return m.clone();
}

есть ли лучший способ? Как я могу использовать std :: move только для перемещения указателя? Я не хочу копировать данные, просто перемещаю указатель векторных данных в O (1).

1 Ответ

0 голосов
/ 06 мая 2018

Почему бы вам не выполнить рефакторинг, чтобы getMat вернул вектор, а затем преобразовал вектор в cv::Mat позже в doProcessing():

void doProcessing()
{
  //...
  vector<double> v = getMat(12.2, 144, ...);

  cv::Mat m(100, 100, 1, myData.data(), myData.size());
  cout<< m.at<double>(0,0);
  //...
}

vector<double> getMat(some parameters){
  vector<double> myData;
  //do some processing on parameters and myData

  return myData;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...