cv :: Mat的deallocate方法有什么作用?

时间:2016-07-12 11:48:02

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

以下代码

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。

2 个答案:

答案 0 :(得分:3)

// MyCustomType.php public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'validation_groups' => function (FormInterface $form) { $data = $form->getData(); if (Client::TYPE_PERSON == $data->getType()) { return array('person'); } return array('company'); }, )); } 将直接从deallocate()解除分配数据。但是,cv::Mat只会降低release()的{​​{1}},如果达到0,则会自行调用ref_count

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

还要注意,您不需要调用其中任何一个。在deallcoate的析构函数中将调用release

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

答案 1 :(得分:1)

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