我在提供普通C接口的DLL中使用OpenCV,不允许将C ++对象移交给调用应用程序。
此DLL的一部分执行基准学习以用于稍后的模式识别,这导致关键点列表和Mat对象。这些数据必须由调用应用程序存储。
使用普通的C结构通过DLL接口移交关键点是没有问题的,这样的关键点的成员可以很容易地转换。但是我没有看到cv :: Mat的哪些部分真正需要。或者更确切地说:我的Mat-object使用指向内存区域的成员“data”,但我不知道包含了多少数据。
所以我的问题是:如何将cv :: Mat对象转换为普通的C风格结构,如何估计数据字段的确切长度?
谢谢!
答案 0 :(得分:1)
简单的方法是将cv :: Mat转换为经典的OpenCV C结构:IplImage。
cv::Mat mat = imread(...);
IplImage img(mat); // hope it's the correct syntax...
Mat参数的更详细说明:
以下是计算数据字段长度的方法:
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)
}