Does Mat::push_back(x) copy x elements?

2019-08-04 07:43发布

问题:

Based on my humble understanding, OpenCV's Mat handles the memory management efficiently; so copying Mats does not mean they are "hard/physically" copied; they just refer to the original Mat.

However, for mats that has been pushed into a larger Mat using push_back, is it safe to clear them assuming that they were hard copied, not using same technique of copying like in x=y?

In the following code, does bigx still has x's contents even after releasing the latter?

Mat x, bigx;
bigx.push_back(x);
x.release();

thank you :)

回答1:

As far as I know Mat::pushback() will create a separate copy of source on each pushback. So you can release your source after pushback.

See an example below,

   Mat src=imread("src.jpg",1);
   int rowSize=src.rows;
   Mat A;
   A.push_back(src.reshape(0,1));
   src.release();

   Mat B;
   B = A.row(0).clone();
   imshow("src",B.reshape(0,rowSize));
   waitKey(); 


回答2:

Yes, push_back calls the copy constructor to create a fresh clone element of same type keeping the original (source) at the discretion.