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

时间:2013-04-09 04:55:23

标签: android opencv

我正在尝试使用OpenCv4Android为Android设备编写一些应用程序。早些时候,我使用的是Android NDK和C ++本机代码。但这种技术并不是很清晰。所以我切换到最新的Java API以及OpenCv 2.4.4版本。

我能够编写简单的程序并运行示例。但是,虽然我试图为高级问题编写一些代码,如模型POSE估计,相机校准程序等,但我遇到了这种非常奇怪的混乱。在C ++ API中名称非常直观的一些数据类型并不真正适合它们的Java对应物。因此,我将我的功能从C ++移植到Java面临着可怕的困难。我在这些职能中面临着完全混乱

  • Point2f(在C ++中) - MatOfPoint2f(在Java中)
  • Point3f(在C ++中) - MatOfPoint3f(在Java中)
  • Point2(在Java中)
  • Point3(在Java中)

请帮助我理解OpenCv Java中使用的术语及其与C ++的类比。

另外,请给我一些参考,其中给出了这些术语的清晰和清晰的描述(我试着看一下提供的帮助,但它对我没什么帮助,因为它对C ++和Java来说有点类似)

1 个答案:

答案 0 :(得分:5)

引用Andrey Pavlenko:

  

引入了MatOfXxx类(例如MatOfPoint)以避免冗余   在Java和本机内存之间复制中间数据。例如。您   作为一个OpenCV函数的结果,可以得到一些大的点集   然后将它传递给另一个。

     

在C ++中我们使用std :: vector   为了这。但是在Java中使用ArrayList造成的   将所有Points数据从本机OpenCV级别复制到Java时   返回这些点并在呼叫下一个时将其复制回来   OpenCV函数使用它们。所以为了效率,我们改变了   在这种情况下使用MatOfPoint类是一种1n的Mat   或n1维度,在每个元素中保持一个Point(即类型   CV_32SC2或CV_64FC2)。

     

如您所知,Mat会保留所有数据   本机级别,因此可以在OpenCV调用之间传递此类对象   没有数据复制。但是如果你需要在某些时候使用Java代码   直接访问实际的Points数据有toArray()和fromArray   显式向/从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)将您的积分放入原生水平
  •   
     

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