将一个cv :: Mat推入另一个是要复制吗?

时间:2016-07-21 15:20:24

标签: c++ opencv image-processing matrix

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

如果您有更好的替代解决方案,请发布!

1 个答案:

答案 0 :(得分:2)

此代码仅复制Mat对象,它是某种标题或指向实际数据元素的智能指针。

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

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