If developer want to pre-allocate the memory for some of the cv::Mat, he may do like this:

std::vector<cv::Mat> vecMats(4, cv::Mat::zeros(500, 500, CV_8UC1));

It looks correct at the first glance, but after do some experitent, it shows all the 4 Mat in the vector share the same memory, which means all of 4 images will be the same. Why?

Because above will assign the same temporary Mat object to each of the element, and cv::Mat assignment is a shallow copy, so all all the them share the same memory.

The correct way to initiaze the vector should be like below:

std::vector<cv::Mat> vecMats(4);
for (auto& mat : vecMats)
    mat = cv::Mat::zeros(500, 500, CV_8UC1);

This method can make sure each element in the vector are using different memory.

posted on 2019-09-18 15:03  xsgluozi  阅读(352)  评论(0编辑  收藏  举报