将 c++ opencv IplImage imageData 和 widthStep 转换为 android opencv Mat

Posted

技术标签:

【中文标题】将 c++ opencv IplImage imageData 和 widthStep 转换为 android opencv Mat【英文标题】:Convert c++ opencv IplImage imageData and widthStep to android opencv Mat 【发布时间】:2016-06-23 14:55:31 【问题描述】:

我正在使用 opencv 开发一个 android 应用程序。 我有一个用 C++ 编写的算法,它使用 opencv,我正在将它移植到 java。 原始代码使用“IplImage”,但现在我不得不使用“Mat”。我设法转换了大部分代码,但我遇到了以下说明的问题:

IplImage *src;
src->imageData;
src->widthStep;

我可以使用

[JAVA - Mat]src.dataAddr()  as an equivalent for [C++ - IplImage]src ->imageData

[JAVA - Mat]src.step1(0) as an equivalent for [C++ - IplImage]src->widthStep ?

我发现该主题固有的唯一链接是this one,它解释了如何将“IplImage”转换为“Mat”,但仍使用 C++。我不能使用 javacv。

谢谢

【问题讨论】:

对于深度,Mat 类有一个方法depth() - docs.opencv.org/java/2.4.2/org/opencv/core/Mat.html#depth() 【参考方案1】:

对于深度,Mat class has a method depth()

widthStep 有点棘手,因为 Mat 的 step 与 IplImage 中的 widthStep 并不完全相同,但似乎不再需要四的倍数 widthStep。 Here 是一个有趣的阅读答案。也就是说,Mat class also has a method for getting the step

关于imageData,我不确定IplImage 的imageData 到底包含什么,但是使用Mat,您可以通过循环矩阵并使用get(int row, int col) 等方法从单个像素中获取数据。通过documentation of Mat。我相信你会有很多选择。

在文档的开头,讨论了 IplImage 和 Mat 以及如何将数据保存在 Mat 和 IplImage 中。搜索

所以,Mat 中的数据布局完全兼容 CvMat、IplImage、 和 OpenCV 1.x 中的 CvMatND 类型。

并阅读它。

还可以阅读

这种用户分配数据的部分但非常常见的情况是 从 CvMat 和 IplImage 到 Mat 的转换。为此,有 是带有指向 CvMat 或 IplImage 的指针的特殊构造函数,并且 可选标志,指示是否复制数据。

【讨论】:

以上是关于将 c++ opencv IplImage imageData 和 widthStep 转换为 android opencv Mat的主要内容,如果未能解决你的问题,请参考以下文章

将灰度、彩色和精巧的图像(3)全部复制到一个大的 IplImage:Opencv 错误?

求opencv用C++实现边缘检测以及求两直线之间的距离

从 IplImage 中提取并保存图像

在界面上使用带有 C++ 的 OpenCV 旋转图像

如何将 8 位 OpenCV IplImage* 转换为 32 位 IplImage*?

opencv:将iplimage转换为mat后出错