在矢量到矢量中复制数据<float> <Mat> (Opencv/C++)
Copy data in Vector<float> to Vector<Mat> (Opencv/C++)
在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都指向同一个地方。因此,导致其中一个数据的任何变化都会影响其他数据。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中