【问题标题】:How to convert an OpenCV cv::Mat into a float* that can be fed into Vlfeat vl_dsift_process ?如何将 OpenCV cv::Mat 转换为可以输入 Vlfeat vl_dsift_process 的浮点*?
【发布时间】:2011-10-28 08:57:08
【问题描述】:

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

【问题讨论】:

  • 可能这个问题与矩阵如何从 Matlab 传递到 C 有关?

标签: c opencv computer-vision


【解决方案1】:

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

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

【讨论】:

  • 矩阵要检查是否连续,否则不能解释为一维数组。而且我认为在这里使用reinterpret_cast 更合适,因为它清楚地表明了这种演员的危险性质。无论如何,DSIFT 提取可能比将矩阵转换为vector<float> 慢很多数量级,所以我认为相关的开销可以忽略不计,值得增加安全性和可移植性。
【解决方案2】:

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

DSIFT 需要一个灰度图像,其中像素 (x, y) 的强度作为浮点值存储在 float_array[y * width + 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]);

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 2011-06-28
    • 2016-08-16
    • 1970-01-01
    • 2022-06-25
    • 2021-11-24
    • 2017-06-03
    • 2013-10-21
    • 2020-10-29
    相关资源
    最近更新 更多