Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将Mat对象推回矢量的安全方法_C++_Opencv_Vector_Computer Vision_Mat - Fatal编程技术网

C++ 将Mat对象推回矢量的安全方法

C++ 将Mat对象推回矢量的安全方法,c++,opencv,vector,computer-vision,mat,C++,Opencv,Vector,Computer Vision,Mat,我有一个假问题,因为发生了一些非常奇怪的事情。我试图将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<<

我有一个假问题,因为发生了一些非常奇怪的事情。我试图将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");
}
intmain()
{
载体a;
matm(2,1,CV_32FC1,标量(100));
matk(2,1,CV_32FC1,标量(150));
材料b;
b=K-M;
a、 推回(b);
b=K+M;
a、 推回(b);

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

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

在第二种情况下,您正在创建一个
std::vector
,它应该包含
cv::Mat
类型的元素,但您正在向其中添加
cv::Mat
类型的元素。因此,您面临未定义的行为

如果要创建类型为
CV\u 8UC1
的矩阵,则应将它们放入类型为
std::vector
的向量中

您还可以通过使用
cv::Mat
类型而不是
cv::Mat
使其成为泛型

std::vector<cv::Mat> a;
std::向量a;

正如他们在默认情况下所说,cv::Mat不复制,而是使用尽可能多的已分配数据,在您的代码中,b被使用两次。另一种解决方案是直接
推回(K-M)
(K+M)
,正如您在我的代码中看到的那样。如果您想清楚地说明,您可以
推回(cv::Mat(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");
}
intmain(){
载体a;
matm(2,1,CV_32FC1,标量(100));
matk(2,1,CV_32FC1,标量(150));
a、 推回(K-M);
a、 推回(K+M);
库特
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");
}