OpenCv4Android 和 C++ 数据类型之间的混淆

2023-11-27

我正在尝试使用 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(使用前将#替换为@)

OpenCv4Android 和 C++ 数据类型之间的混淆 的相关文章

随机推荐