如何将OpenCV::Mat转换为可以输入Vlfeat vl_dsift_进程的浮点*?

如何将OpenCV::Mat转换为可以输入Vlfeat vl_dsift_进程的浮点*?,c,opencv,computer-vision,C,Opencv,Computer Vision,如何将OpenCVcv::Mat转换为可以馈送到Vlfeat vl_dsift_进程的float*? 我无法理解vl\u dsift\u进程如何在一维浮点数组上工作。 官方示例仅演示如何使用MatlabAPI。 似乎没有关于C API的示例,唯一的线索是源程序包中的MEX文件。float*matData=(float*)myMat.data 在完成使用数据指针之前,确保矩阵未被删除/超出范围。并确保矩阵包含浮点数 我无法理解vl_dsift_进程如何在一维浮点数组上工作 DSIFT需要一个灰度图

如何将OpenCV
cv::Mat
转换为可以馈送到
Vlfeat vl_dsift_进程的
float*
? 我无法理解
vl\u dsift\u进程如何在一维浮点数组上工作。
官方示例仅演示如何使用MatlabAPI。
似乎没有关于C API的示例,唯一的线索是源程序包中的MEX文件。

float*matData=(float*)myMat.data

在完成使用数据指针之前,确保矩阵未被删除/超出范围。并确保矩阵包含浮点数

我无法理解vl_dsift_进程如何在一维浮点数组上工作

DSIFT需要一个灰度图像,其中像素(x,y)的强度作为浮点值存储在浮点数组[y*宽度+x]中。在OpenCV中,图像存储为无符号字符,因此将Mat::data简单转换为float*将不起作用。您必须手动将每个值转换为浮点:

Mat mat = imread("image_name.jpg", 0); // 0 stands for grayscale

vector<float> img;
for (int i = 0; i < mat.rows; ++i)
  for (int j = 0; j < mat.cols; ++j)
    img.push_back(mat.at<unsigned char>(i, j));

vl_dsift_process(dsift, &img[0]);
Mat Mat=imread(“image_name.jpg”,0);//0代表灰度
矢量img;
对于(int i=0;i
这个问题可能与矩阵如何从Matlab传递到C有关?应该检查矩阵是否连续,否则不能将其解释为一维数组。我认为在这里使用
重新解释施法
更合适,因为它清楚地表明了这种施法的危险性。无论如何,DSIFT提取可能比将矩阵转换为向量慢很多数量级,因此我认为相关的开销可以忽略不计,值得增加安全性和可移植性。