以下代码

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。

最佳答案

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

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

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

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

09-28 07:24