如何将OpenCV cv :: Mat转换为可以送入Vlfeat vl_dsift_process的float *?

时间:2011-10-28 08:57:09

标签: c opencv computer-vision

如何将OpenCV cv::Mat转换为可以输入float*的{​​{1}}? 我无法理解Vlfeat vl_dsift_process如何在一维浮点数组上工作。 官方样本仅演示了如何使用MatLab API。 似乎没有关于C API的示例,唯一的线索是源包中的MEX文件。

2 个答案:

答案 0 :(得分:12)

float* matData = (float*)myMat.data;

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

答案 1 :(得分:5)

  

我无法理解vl_dsift_process如何在一维浮点数组

上运行

DSIFT期望一个灰度图像,其中像素(x,y)的强度存储在float_array [y * width + x]中作为浮点值。在OpenCV中,图像存储为无符号字符,因此Mat :: data到float *的简单转换将不起作用。您必须手动将每个值转换为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]);