【问题标题】:efficient way to create an opencv mat from std::vector从 std::vector 创建 opencv mat 的有效方法
【发布时间】:2018-10-15 19:38:52
【问题描述】:

如果我想从 std::vector 创建一个 opencv mat,我使用以下函数:

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())

这个构造函数不复制数据,所以当向量是 temp 并且我们返回 mat 时,mat 有无效数据,所以我返回它的一个副本,这是低效的。

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) 中移动向量数据指针。

【问题讨论】:

  • 只要您使用Mat,就必须保留向量,因为向量是唯一保存数据的东西。创建一个包含向量和cv::Mat 的结构怎么样(它会是movable)?
  • 您能否提供代码说明您的实际问题,以便我们提出解决方案?
  • 在计算过程中你的向量大小是已知的并且是固定的吗?
  • 如果你不想复制,那么只要垫子存在,就保留矢量。

标签: c++ opencv vector copy


【解决方案1】:

你为什么不重构getMat返回一个向量,然后在doProcessing()中将向量转换为cv::Mat

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;
}

【讨论】:

  • 方法不好。你返回vector&lt;double&gt;,至少在 C++03 中,它肯定会复制日期,但这不是一个好主意。而在doProcessing(),你仍然共享记忆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
相关资源
最近更新 更多