【问题标题】:Get data from mat C openCV从 mat C openCV 获取数据
【发布时间】:2015-09-08 17:53:43
【问题描述】:

我有一些 C++ openCV 代码。

有点像

void foo(...., Mat mx){
   ...
   x_d = mx.at<float>(x,y);
   ...
}

我尝试用 C 重写这部分。我读过docs,他们说数据是 CvMap 结构中的联合。但是我在尝试获取它时收到了不同的错误消息。他们在这里:

void foo(...., CvMat *mx){
   ...
   x_d = *(((float*)mx->data) + y * width + x); // cannot convert to a pointer type
   x_d = *(mx->data + y * width + x); // invalid operands to binary + (have 'union <anonymous>' and 'int')
   ...
}

所以我有两个问题。 我怎样才能从这个代码的结构中得到那个浮点数? 这是我需要的数据吗?

【问题讨论】:

  • 您为什么要这样做? OpenCV C API 在 5 年前被替换。您真的应该使用 C++ 编写新代码。
  • 这不是新代码。我尝试在使用 CvMat(仅 C 代码)操作的 gstreamer 插件中使用它。函数 foo()(我尝试重写)是我在使用 Mat 的 C++ 代码中的原型。

标签: c++ c opencv porting unions


【解决方案1】:

您可以使用Get?D 函数或CV_MAT_ELEM 宏。

请看下面的例子:

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    CvMat* m = cvCreateMat(2, 3, CV_32FC1);
    cvSet(m, cvScalar(1.0f));
    cvSet2D(m, 0, 1, cvScalar(2.0f));

    // m
    // 1.0 2.0 1.0 
    // 1.0 1.0 1.0 

    // Using cvGet2d

    CvScalar v00 = cvGet2D(m, 0, 0);
    float f00 = v00.val[0];
    // f00 = 1.0

    CvScalar v01 = cvGet2D(m, 0, 1);
    float f01 = v01.val[0];
    // f00 = 2.0

    // Using CV_MAT_ELEM

    float g00 = CV_MAT_ELEM(*m, float, 0, 0);
    // g00 = 1.0

    float g01 = CV_MAT_ELEM(*m, float, 0, 1);
    // g01 = 2.0


    return 0;
}

【讨论】:

    【解决方案2】:

    第一条指令似乎几乎是正确的,但错误是说您尝试将结果视为指针。显然它不是一个指针,而是一个数字。应该是飘了试试这个:

    x_d = (((float*)mx->data) + y * width + x);
    

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多