在矢量到矢量中复制数据<float> <Mat> (Opencv/C++)

Copy data in Vector<float> to Vector<Mat> (Opencv/C++)

本文关键字:gt lt Opencv C++ Mat float 复制 数据      更新时间:2023-10-16

在C++我有以下代码。我正在尝试将存储在矢量中的数据复制到矩阵中(在矢量内)。我尝试这样做:

Vector<float> vec;
// Let's imagine that vec contains 10 float values: {1,2,3 ...., 10}
// I'd like to copy those numbers into a Mat variable 
Vector<Mat> myMats;
myMats.push_back(Mat(2,5,CV_32FC1,&vec.front()));

它有效。但是!,当修改向量"vec"上的内容并尝试将其插入我的 Mat 向量的另一个位置时,它们都获得了最后一个"push_back"操作的值。"myMats"中的所有条目都被最后一个条目覆盖。我该如何解决这个问题?

我认为问题是使用引用("&"),每次修改地址,在哪里查找。

好的。我已经想出了怎么做(创建一个临时垫子)

Mat temp_;
temp_ = Mat(2,5,CV_32FC1,&vec.front());
myMats.push_back(temp_.clone());

我想有一种更有效的方法,但这工作正常。

OP已经自己解决了。但是,如果以后有人来这个问题,这是一些澄清。

cv::Mat是一个容器,其中包含指向实际数据的指针。创建如下cv::Mat时:

cv::Mat some_mat;

cv::Mat在堆栈中创建,它将通过在其结构中保留指针来指向堆中的数据。 当您使用其复制构造函数/赋值复制cv::Mat时,如下所示:

cv::Mat another_mat=some_mat;

或者这个:

some_vector_of_mats.push_back(some_mat);

将发生浅拷贝。换句话说,cv::Mat的标题(行和列计数,类型...)将被深度复制,指向实际数据的指针将被浅拷贝。但实际数据不会被复制。因此,在OP案例中发生的事情是,每次将cv::Mat推送到向量时,都会发生一个浅拷贝。复制的指针,其值没有变化。所以,所有的cv::Mat都指向同一个地方。因此,导致其中一个数据的任何变化都会影响其他数据。