我正在尝试使用 OpenCv4Android 为 Android 设备编写一些应用程序。早些时候,我使用 Android NDK 和 C++ 本机代码。但这项技术不太清晰。所以我切换到最新的 Java API 以及 OpenCv 2.4.4 版本。
我能够编写简单的程序并运行示例。但是,当我尝试为模型姿势估计、相机校准例程等高级问题编写一些代码时,我遇到了这种非常奇怪的困惑。一些数据类型的名称在 C++ API 中非常直观,但在 Java 中并不真正适合。因此,将我的功能从 C++ 移植到 Java 时面临着巨大的困难。我对这些功能感到完全困惑
- Point2f(C++ 中)-MatOfPoint2f(Java 中)
- Point3f(C++ 中)-MatOfPoint3f(Java 中)
- Point2(Java 中)
- Point3(Java 中)
请帮助我理解 OpenCv Java 中使用的术语及其与 C++ 的类比。
另外,请建议我一些参考资料,其中对这些术语给出了清晰明了的描述(我尝试观看所提供的帮助,但它对我没有多大帮助,因为它对于 C++ 和 Java 都有些相似)。
引用安德烈·帕夫连科的话:
引入 MatOfXxx 类(例如 MatOfPoint)以避免冗余
在 Java 和本机内存之间复制中间数据。例如。你
可以通过一个 OpenCV 函数获得一大组点
然后将其传递给另一位。
在 C++ 中我们使用 std::vector
为了这。但是在Java中使用ArrayList导致
将所有点数据从本机 OpenCV 级别复制到 Java
返回这些点并在调用下一个时将它们复制回来
使用它们的 OpenCV 函数。所以为了效率我们换了
在这种情况下使用 MatOfPoint 类,它是 1n 的 Mat
或 n1 个维度,在每个元素中保留一个 Point(即类型
CV_32SC2 或 CV_64FC2)。
如您所知,Mat 保留所有数据
本机级别,因此此类对象可以在 OpenCV 调用之间传递
无需数据复制。但是如果在你的 Java 代码中的某个时候你需要
直接访问实际的 Points 数据有 toArray() 和 fromArray
与 Java 之间显式传输数据的方法。
例如,创建一个 MatOfPoint2f
包含与现有点相对应的点
MatOfKeyPoint 你需要:
- 通过 MatOfKeyPoint.toArray() 将关键点加载到 Java
- 迭代KeyPoint[]并创建对应的Point[](所有cv::Point、cv::Point2f和cv::Point2d都表示为
Java 中的 org.opencv.core.Point)
- 使用 MatOfPoint2f.fromArray() 或 c-tor MatOfPoint2f(Point...pa) 将您的点置于本机级别
至于 C++ 与 Java 类型对应关系:
vector<Point> : MatOfPoint
vector<Point2f> : MatOfPoint2f
vector<Point3i> : MatOfPoint3
vector<Point3f> : MatOfPoint3f
vector<KeyPoint> : MatOfKeyPoint
vector<DMatch> : MatOfDMatch
vector<Rect> : MatOfRect
vector<uchar> : MatOfByte
vector<char> : MatOfByte
vector<int> : MatOfInt
vector<float> : MatOfFloat
vector<double> : MatOfDouble
vector<Vec4i> : MatOfInt4
vector<Vec4f> : MatOfFloat4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)