【问题标题】:What does cv::Mat's deallocate method do?cv::Mat 的 deallocate 方法有什么作用?
【发布时间】:2016-11-14 15:32:09
【问题描述】:

以下代码

int main(int argc, char** argv)
{
  cv::Mat1b i1(cv::Size(1, 2));
  i1.at<uchar>(0, 0) = 1;
  i1.at<uchar>(1, 0) = 1;

  cv::Mat1b mask(i1.size());
  mask.at<uchar>(0, 0) = 1;
  mask.at<uchar>(1, 0) = 0;

  cv::Mat1b masked;
  mask.copyTo(masked, mask);

  masked.release(); //or .deallocate()
  cout << masked << endl;
  i1.copyTo(masked, 1 - mask);
  cout << masked << endl;
  return 0;
}

masked.release()masked.deallocate() 替换时,行为会大不相同。在后一种情况下,矩阵masked 似乎根本没有修改,输出masked 是掩码矩阵和反转掩码矩阵的总和,因此等于原始im1 矩阵。 deallocate() 成员方法实际上是做什么的?我使用 openCV 3.1。

【问题讨论】:

  • Mat::release。通过在调用 deallocate() 之后使用该对象,您可能会遇到未定义的行为。
  • 我认为release()deallocate() 做同样的事情。并且两者都应该使对象处于“清除”状态。
  • 除非文档明确指出 release()deallocate() 不做同样的事情 :)

标签: c++ opencv reference-counting opencv-mat


【解决方案1】:

deallocate() 将直接从cv::Mat 中释放数据。但是,release() 只会减少 cv::Matref_count,如果它达到 0,它将自行调用 deallcoate

总结:始终使用release,直到您知道自己在做什么。

还要注意,您不需要调用它们中的任何一个。 release 将在 cv::Mat 的析构函数期间被调用。

P.S 在解除分配后使用cv::Mat 的数据被认为是未定义的行为。

【讨论】:

    【解决方案2】:

    Mat::deallocate() 释放矩阵时,Mat::release() 减少引用计数器并释放矩阵如果需要。如果引用计数达到 0,则使用 release() 时,Mat 会被释放,而 deallocate() 总是会释放它。更多信息HERE

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 1970-01-01
      • 2014-06-21
      • 2013-03-30
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      相关资源
      最近更新 更多