如何清除 cv::Mat 内容?

Posted

技术标签:

【中文标题】如何清除 cv::Mat 内容?【英文标题】:How to clear the cv::Mat contents? 【发布时间】:2013-05-29 14:55:55 【问题描述】:

我有一个cv::Mat,但我已经插入了一些值,如何清除其中的内容?

谢谢

【问题讨论】:

【参考方案1】:

如果要释放Mat 变量的内存,请使用release()

Mat m;
// initialize m or do some processing
m.release();

对于cv::Mat 对象的向量,您可以使用myvector.clear() 释放整个向量的内存。

std::vector<cv::Mat> myvector;
// initialize myvector .. 

myvector.clear(); // to release the memory of the vector

【讨论】:

如果你使用 m.release() 并尝试再次使用 Mat,你会得到一个错误。由于他似乎只是一个重置值,分配一个标量值听起来更好的方法。 @luiz_s81 不清楚他想要什么;这取决于用户。无论如何将 Mat 元素设置为零有什么意义?这是一个额外的操作,不会使矩阵占用更少的内存。如果他想重用矩阵,他不妨保留前一个矩阵,然后在需要时将其元素重新分配给他想要的任何东西(不一定是零)。【参考方案2】:

来自docs:

// sets all or some matrix elements to s
Mat& operator = (const Scalar& s);

那么我们可以做

m = Scalar(0,0,0);

用黑色像素填充。标量有 4 个组件,最后一个 - alpha - 是可选的。

【讨论】:

【参考方案3】:

你应该调用 release() 函数。

 Mat img = Mat(Size(width, height), CV_8UC3, Scalar(0, 0, 0));
 img.release();

【讨论】:

【参考方案4】:

您可以release当前内容或分配一个新的Mat

Mat m = Mat::ones(1, 5, CV_8U);

cout << "m: " << m << endl;
m.release();  //this will remove Mat m from memory

//Another way to clear the contents is by assigning an empty Mat:
m = Mat();

//After this the Mat can be re-assigned another value for example:
m = Mat::zeros(2,3, CV_8U);
cout << "m: " << m << endl;

【讨论】:

m.release() 将删除 Mat 变量的内存。但是,只需将 m 分配给 Mat() 将清除内容,这并不意味着要继续使用 m.release()。在 m 被分配 Mat() 之后,它可以重新分配给其他一些值,例如 Mat::zeros(2,3, CV_8U)【参考方案5】:

如果你想清空垫子但继续使用变量,你总是可以重新声明它。如果这就是你想要的,我不知道,但由于“清理”垫子的另一个答案是 .release() 我只想提一下。

编辑:我的错。我没有意识到我的答案有多不清楚。我只是在回答“如何清除 Mat 变量的内容”的问题。另一个人回答说,一个人可以对变量执行 .release() ,例如,这个人有一个变量,例如 cv::Mat testMat; 和后来它被宣布(正如问题所暗示的那样)。 一个人说你可以做一个简单的testMat.release()。如果这就是 op 想要的,那么你就去吧。但是如果 op 只是想清除变量的声明,我只是想提一下他/她可以重新声明它,就像稍后做一个简单的 testMat = *some new information* 一样。另外,我混淆了定义和声明。我的坏

【讨论】:

请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。

以上是关于如何清除 cv::Mat 内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何发送包含 cv::Mat 的 Qt 信号?

如何将像素数据的所有权传递给 cv::Mat

如何将 cv::mat 对象从 python 模块传递给 c++ 函数并返回返回的 cv::mat 类型的对象?

如何将单个图像从图像矢量复制到临时 cv::Mat?

如何从 c++ 接口 cv::Mat 转换为 c IplImage?

如何确定 cv::Mat 是不是有任何零值?