我有一个std::vector<cv::Mat> descriptors,其中descriptor[i]是我的数据集的i-th图像的描述符矩阵。

如果我要这样做:

cv::Mat descriptorsMat;
for(const auto mat : descriptors)
    descriptorsMat.push_back(mat);

是要在mat的末尾复制descriptorsMat(时间和内存效率低下),还是要在mat的末尾添加descriptorsMat的引用(这是有效的,但可能被认为是不安全的)?

为什么需要这个:,因为我要使用这些描述符矩阵从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对象(它是某种 header 或智能指针)复制到实际数据元素。

cv::Mat descriptorsMat;
for(const auto mat : descriptors)
      descriptorsMat.push_back(mat);

它正在复制Mat对象,而不是数据。 Mat对象类似于智能指针,它是对数据引用进行计数的引用。要深度复制Mat数据,您必须调用mat.clone或mat.copyTo

10-04 17:56