以下代码
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。
答案 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