0

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

该 DLL 的一部分为以后的模式识别执行基准学习,从而产生一个关键点列表和一个 Mat 对象。这些数据必须由调用应用程序存储。

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

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

谢谢!

4

2 回答 2

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()
于 2012-09-27T14:09:17.603 回答
1

如果您需要将原始指针传递给图像数据,那么在最坏的情况下,您将不得不使用指针魔术进行一些复制,因为图像数据可能不是连续的。本教程对此进行了很好的描述。

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)
}
于 2012-09-27T15:25:10.683 回答