如何将cv::Mat转换为浮点指针

How do I convert an cv::Mat to float pointer?

本文关键字:指针 转换 Mat cv      更新时间:2023-10-16

我想将cv::SIFT描述符cv::Mat descriptors的矩阵表示为float*。这是因为我想使用VLFeat的GMM(如果你有更好的解决方案,请告诉我)。这是我想出的代码:

if(!prova.isContinous()){
    std::err<<"Descriptor matrix not continuous!"<<std::endl;
    return 1;
}
float *data = new float[desc.total()];
std::memcpy(data,prova.data,prova.total() * sizeof(float));

用玩具矩阵尝试这个代码:

cv::Mat prova = (cv::Mat_<float>(3,3) << 0.1, 0.3, 2.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8);

并打印值:

for(int i=0;i<prova.total();i++)
    std::cout<<*(data+i)<<std::endl;

这很好,但既然我们在处理指针(这总是一件危险的事情),我想听听意见。

注意:只是为了给出一个上下文,这就是我将如何使用data:

VlGMM* gmm = vl_gmm_new(VL_TYPE_FLOAT, desc.cols, 2) ;
vl_gmm_cluster (gmm, data, desc.rows);

您可以使用Mat::ptr方法来获取指向任何行开头的浮点指针。具体来说,矩阵的开头是:

const float* buffer=desc_mat.ptr<float>(0);

如果步幅不等于列数*4可能发生的问题
4=浮点大小,你可以在数据中得到洞,所以唯一可以确定的方法是逐像素复制