使用NO C ++构造保存cv :: Mat数据以供以后使用

时间:2012-09-27 13:41:57

标签: c++ c object opencv data-structures

我在提供普通C接口的DLL中使用OpenCV,不允许将C ++对象移交给调用应用程序。

此DLL的一部分执行基准学习以用于稍后的模式识别,这导致关键点列表和Mat对象。这些数据必须由调用应用程序存储。

使用普通的C结构通过DLL接口移交关键点是没有问题的,这样的关键点的成员可以很容易地转换。但是我没有看到cv :: Mat的哪些部分真正需要。或者更确切地说:我的Mat-object使用指向内存区域的成员“data”,但我不知道包含了多少数据。

所以我的问题是:如何将cv :: Mat对象转换为普通的C风格结构,如何估计数据字段的确切长度?

谢谢!

2 个答案:

答案 0 :(得分:1)

简单的方法是将cv :: Mat转换为经典的OpenCV C结构:IplImage。

cv::Mat mat = imread(...);
IplImage img(mat); // hope it's the correct syntax...

Mat参数的更详细说明:

  • 数据:指向数据的指针
  • 行,列:...
  • type() - 数据类型:
  • 渠道() - 渠道数量
  • step() - 在图像中的两个连续行之间跨越,以字节为单位。 “包括差距,如果有的话”
  • size_t elemSize()类似于CV_ELEM_SIZE(cvmat-> type)
  • size_t elemSize1()以字节为单位返回元素通道的大小。

以下是计算数据字段长度的方法:

Mat::rows * Mat::step()

答案 1 :(得分:1)

如果您需要将原始指针传递给图像数据,那么在最坏的情况下,您将不得不使用指针魔术进行一些复制,因为图像数据可能不是连续的。它在this tutorial中有详细描述。

int channels = I.channels();

int nRows = I.rows * channels;
int nCols = I.cols;

if (I.isContinuous())
{
    nCols *= nRows;
    nRows = 1;
}

int i,j;
uchar* p;
for( i = 0; i < nRows; ++i)
{
    p = I.ptr<uchar>(i);
    // And here "p" points to "nCols" components
    // row size = nCols * channels * component size (1 byte usually)
}