c++ - 将 Mat 对象推回 vector 的安全方法

标签 c++ opencv vector computer-vision mat

我有一个虚拟问题,因为确实发生了一些奇怪的事情。我正在尝试将 Mat 对象推到一个 vector 中。例如:

int main()
{
vector<Mat_<float>> a;
Mat M(2,1, CV_32FC1, Scalar(100));
Mat K(2,1, CV_32FC1, Scalar(150));
Mat b;
b=K-M;
a.push_back(b);
b=K+M;
a.push_back(b);

cout<<a[0]<<endl<<endl;
cout<<a[1]<<endl<<endl;

system("pause");
}

这个效果不太好。最后我的 vector 只包含 b=K+M Mat。 这是预料之中的,我认为是因为我每次只 push_back header ,如果数据发生变化,这会影响 vector 中的两个垫子。如果我改用 a.push_back(b).clone,问题就解决了。 现在当我像这样运行代码时(将 CV_32FC1 更改为 CV_8UC1):

    int main()
{
vector<Mat_<float>> a;
Mat M(2,1, CV_8UC1, Scalar(100));
Mat K(2,1, CV_8UC1, Scalar(150));
Mat b;
b=K-M;
a.push_back(b);
b=K+M;
a.push_back(b);

cout<<a[0]<<endl<<endl;
cout<<a[1]<<endl<<endl;

system("pause");
}

最终 vector 包含我推回的两个矩阵。这怎么可能发生?也许我也不明白第一种情况到底发生了什么,但我找不到任何其他方法来安全地传递 Mat对象到一个 vector (就像在这种情况下),而不使用 clone()。

最佳答案

将 cv::Mat 类型从 CV_32FC1 更改为 CV_8UC1 不会改变任何东西 - 添加到 vector 时您仍然进行了标题复制。这是预期和期望的。默认情况下,opencv 避免复制整个矩阵数据。如果您想将元素存储在 vector 中并且它们按值彼此不同,则必须使用 clone()。这就像一个证明。假设您没有使用 clone() 并且仍然想通过值来区分 vector 中的矩阵。在我看来这很矛盾。 Opencv Mat 就像一个智能指针。它存储数据,直到变量的引用计数变为 0。所以安全地,您可以按照您自己在问题中注意到的那样执行以下操作:

b=K-M;
a.push_back(b.clone());
b=K+M;
a.push_back(b);

关于c++ - 将 Mat 对象推回 vector 的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22934261/

相关文章:

c++ - 从派生类初始化 const fusion boost 列表

image-processing - openCV 中 Unresolved external symbol 错误

opencv - 使用 Surf 进行目标检测

c++ - CUDA/CUBLAS : Accessing elements in an array

c++ - 给定一个 vector ,删除低于 itemnum 的元素

c++ - MSVC : C++14: std:set: comparison function: why "const" is required?

c++ - OpenGl 4,GL_ARRAY_BUFFER 没有正确发送法线数据

opencv - 该网站是否几天前就关闭了answer.opencv.org?

c++ - 如何从函数返回 vector

c++ - 删除指向同一对象的所有指针