将Vector <float>中的数据复制到Vector <mat>(Opencv / C ++)

时间:2016-01-23 14:58:53

标签: c++ opencv vector

在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”中的所有条目都会被最后一个条目覆盖。我怎么解决这个问题?

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

2 个答案:

答案 0 :(得分:2)

确定。我已经弄明白了怎么做(创建一个临时的Mat)

mcard_list mcardlist = new mcard_list();
numberoftimes = 0;
timesheet.AddTomcard_list(mcardlist);
while (numberoftimes < collectionnumbers)
{
    var FieldName = mcardlistfields[numberoftimes, 0].ToString();
    var FieldType = mcardlistfields[numberoftimes, 1].ToString();

   switch (FieldType)
  {

      case "String" :


         mcardlist. + FieldName = "Test"; <=I know wrong here but i don't know how to do.

         break;

      case "DateTime" :

         mcardlist. + FieldName = "2015-1-23"; <=I know wrong here I don't know how to do it.

         break;
  }

   numberoftimes += 1;
}
timesheet.SaveChanges();

我想有一种更有效的方法,但这样做没问题。

答案 1 :(得分:1)

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

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

cv::Mat some_mat;

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

cv::Mat another_mat=some_mat;

或者这个:

some_vector_of_mats.push_back(some_mat);

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