将一个简历::Mat推到另一个简历中,就会复制它



我有一个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

相关内容

  • 没有找到相关文章