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