我正在尝试使用OpenCv4Android为Android设备编写一些应用程序。早些时候,我使用的是Android NDK和C ++本机代码。但这种技术并不是很清晰。所以我切换到最新的Java API以及OpenCv 2.4.4版本。
我能够编写简单的程序并运行示例。但是,虽然我试图为高级问题编写一些代码,如模型POSE估计,相机校准程序等,但我遇到了这种非常奇怪的混乱。在C ++ API中名称非常直观的一些数据类型并不真正适合它们的Java对应物。因此,我将我的功能从C ++移植到Java面临着可怕的困难。我在这些职能中面临着完全混乱
请帮助我理解OpenCv Java中使用的术语及其与C ++的类比。
另外,请给我一些参考,其中给出了这些术语的清晰和清晰的描述(我试着看一下提供的帮助,但它对我没什么帮助,因为它对C ++和Java来说有点类似)
答案 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