将 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 错误?