我有一个std::vector<cv::Mat> descriptors
,其中descriptor[i]
是我的数据集的i-th
图像的描述符矩阵。
如果我要做:
cv::Mat descriptorsMat;
for(const auto mat : descriptors)
descriptorsMat.push_back(mat);
它是要在descriptorsMat
的末尾复制mat
(这在时间和内存上都是低效的),还是要在descriptorsMat
的末尾添加mat
的引用(这是高效的,但可能被认为是不安全的)?
为什么我需要这个:因为我要用这些描述符矩阵从VLFeat训练VlGMM
,所以我需要在float *
中加载所有数据。所以一旦我获得descriptorsMat
,我就要做:
if(!descriptorsMat.isContinous()){
std::err<<"Descriptor matrix not continuous!"<<std::endl;
return 1;
}
float *data = new float[descriptorsMat.total()];
std::memcpy(data,descriptorsMat.data,descriptorsMat.total() * sizeof(float));
如果你有更好的替代方案,请发布!
此代码将只复制Mat对象,该对象是指向实际数据元素的某种标头或智能指针。
cv::Mat descriptorsMat;
for(const auto mat : descriptors)
descriptorsMat.push_back(mat);
它复制的是Mat对象,而不是数据。Mat对象类似于智能指针,它是计算数据引用的引用。要深入复制Mat数据,您必须调用Mat.clone或Mat.copyTo