我有个空洞的问题因为发生了一些很奇怪的事情。我正在尝试将Mat对象推向一个向量。例如:
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");
}
这个不能很好的工作,因为我的矢量只包含b=K+M .In。我认为这是意料之中的,因为我每次只push_back头,如果数据改变,这会影响vector.The中的两个Mats,如果我使用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");
}
最后一个向量包含了我推回的两个矩阵,这可能会发生?也许我也不知道第一种情况到底发生了什么,但我找不到任何其他方法来安全地将Mat对象传递给一个向量(就像在这个例子中一样),而不使用in.How ()。
发布于 2014-04-08 11:04:30
将cv::Mat类型从CV_32FC1更改为CV_8UC1不会更改任何内容-在添加到向量时,您仍然执行了标题复制。这是我们所期望和期望的。默认情况下,opencv会避免复制整个矩阵数据。如果你想将元素存储在向量中,并且它们之间的值是不同的,那么你必须使用()。这就像是一个证据。假设您没有使用clone(),并且仍然希望根据向量中的矩阵的值来区分它们。在我看来,这似乎是一种矛盾。Opencv Mat的工作方式类似于智能指针。它存储数据,直到变量的引用计数变为0。因此,您可以按照您自己在问题中注意到的那样安全地执行以下操作:
b=K-M;
a.push_back(b.clone());
b=K+M;
a.push_back(b);
发布于 2014-04-08 11:05:06
在第二种情况下,您正在创建一个std::vector
,它应该包含cv::Mat_<float>
类型的元素,但是您正在向其中添加cv::Mat_<unsigned char>
类型的元素。因此,您面临的是未定义的行为。
如果要创建CV_8UC1
类型的矩阵,则应该将它们放在std::vector< cv::Mat_<unsigned char> >
类型的向量中。
您还可以通过使用cv::Mat
类型而不是cv::Mat_
来使其成为泛型。
std::vector<cv::Mat> a;
发布于 2016-03-19 16:09:01
正如他们已经说过的,默认情况下cv::Mat不复制,相反,他们尽可能多地使用已经分配的数据,在你的代码中b被使用了两次。另一种解决方案是直接使用push_back(K-M)
和(K+M)
,您可以在我的代码中看到。如果你想弄清楚,你可以使用push_back(cv::Mat_<float>(K-M))
来说明你每次都会构造一个新的cv::Mat
。
int main() {
vector<Mat_<float>> a;
Mat M(2, 1, CV_32FC1, Scalar(100));
Mat K(2, 1, CV_32FC1, Scalar(150));
a.push_back(K-M);
a.push_back(K+M);
cout << a[0] << endl << endl;
cout << a[1] << endl << endl;
system("pause");
}
https://stackoverflow.com/questions/22934261
复制相似问题