繁体   English   中英

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

[英]Confusion between OpenCv4Android and C++ data types

我正在尝试使用适用于Android设备的OpenCv4Android编写一些应用程序。 之前,我使用的是Android NDK和C ++本机代码。 但是这种技术并不是很清楚。 因此,我切换到了OpenCv 2.4.4版本附带的最新Java API。

我能够编写简单的程序并运行示例。 但是,尽管我尝试编写一些高级问题代码,例如-模型姿势估计,相机校准例程等,但遇到了这种非常奇怪的混乱。 在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会导致在返回这些Point时将所有Points数据从本机OpenCV级别复制到Java,并在使用它们调用下一个OpenCV函数时将它们复制回。 因此,为了提高效率,我们在这种情况下改用MatOfPoint类,这是一种尺寸为1n或n1的Mat,它在每个元素中保留一个Point(即CV_32SC2或CV_64FC2类型)。

如您所知,Mat将所有数据保留在本机级别,因此可以在OpenCV调用之间传递此类对象,而无需复制数据。 但是,如果在某些时候需要在Java代码中直接访问实际的Points数据,则可以使用toArray()和fromArray方法来显式向Java传输数据或从Java传输数据。

例如,要创建一个MatOfPoint2f,其中包含与现有MatOfKeyPoint中的点相对应的点,您需要:

  • 通过MatOfKeyPoint.toArray()将KeyPoints加载到Java
  • 遍历KeyPoint []并创建一个对应的Point [](所有cv :: Point,cv :: Point2f和cv :: Point2d在Java中都表示为org.opencv.core.Point)
  • 使用MatOfPoint2f.fromArray()或c-tor MatOfPoint2f(Point ... pa)将您的Point设为本机级别

至于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM