我有一个std::vector<cv::Mat> descriptors
,其中descriptor[i]
是我的数据集的i-th
图像的描述符矩阵。
如果我要这样做:
cv::Mat descriptorsMat;
for(const auto mat : descriptors)
descriptorsMat.push_back(mat);
是否会在mat
结尾处 copy descriptorsMat
(这在时间和内存方面效率都很低)或是否会添加参考mat
descriptorsMat
末尾的VlGMM
(这是有效的,但可能被认为是不安全的)?
为什么我需要这个:因为我要用这些描述符矩阵从VLFeat训练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));
,我就会这样做:
<View style={{overflow:'visible'}}>
<Image style={{flex:1, width:20, height:20, marginRight:20}} source={require('./assets/icon-caddy.png')}>
<View style={{ flex:1, flexDirection:'row', backgroundColor:'#88b148', width: 15, height:15 , position:'absolute', left: 5, top:-5, backgroundColor:'#88b148', borderRadius:50, alignItems:'center', justifyContent:'center'}}>
<Text style={{color:'#fff', fontSize:10 }}>0</Text>
</View>
</Image>
</View>
如果您有更好的替代解决方案,请发布!
答案 0 :(得分:2)
此代码仅复制Mat对象,它是某种标题或指向实际数据元素的智能指针。
cv::Mat descriptorsMat;
for(const auto mat : descriptors)
descriptorsMat.push_back(mat);
它正在复制Mat对象而不是数据。 Mat对象类似于智能指针,它是计算数据引用的引用。要深度复制Mat数据,您必须调用mat.clone或mat.copyTo