2016-01-23 257 views
2

在C++中,我有以下代码。我试图将存储在矢量中的数据复制到矩阵(在矢量内)。我试图这样做:将向量<float>中的数据复制到向量<Mat>(Opencv/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”中的所有条目都被最后一个条目覆盖。我该如何解决这个问题?

我认为问题是使用参考(“&”),每次修改地址,在哪里看。

+0

你为什么推一个临时对象的地址? –

+0

是的,只是编辑了我提到的问题。我第一次在这样的情况下工作,然后我不得不修改代码,但我不知道该怎么做。 – karl71

+0

另外,我不清楚你想要做什么。请描述现在正在发生的事情以及你想达到的目标。 –

回答

2

好的。我已经想通了如何做到这一点(创建一个临时垫)

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

我想有一个更有效的方式,但这个工程确定。

+1

如果可能,请接受您自己的答案。你必须克隆的原因是这个Mat构造函数只是使用数据指针而不是分配自己的内存。 – Micka

1

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

cv::Mat是一个带有指向实际数据的指针的容器。当你创建一个cv::Mat这样的:

cv::Mat some_mat; 

cv::Mat在堆栈中创建,它会通过保持一个指针在其结构指向堆中的数据。

cv::Mat another_mat=some_mat; 

或本:当你使用它的拷贝构造函数/赋值这样复制cv::Mat

some_vector_of_mats.push_back(some_mat); 

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

相关问题