我正在尝试使用OpenCv4Android为Android设备编写一些应用程序.早些时候,我使用的是Android NDK和C++本机代码.但这种技术并不是很清晰.所以我切换到最新的Java API以及OpenCv 2.4.4版本.
我能够编写简单的程序并运行示例.但是,虽然我试图为高级问题编写一些代码,如模型POSE估计,相机校准程序等,但我遇到了这种非常奇怪的混乱.在C++ API中名称非常直观的一些数据类型并不真正适合它们的Java对应物.因此,我将我的功能从C++移植到Java面临着可怕的困难.我在这些职能上面临着完全混乱
请帮助我理解OpenCv Java中使用的术语及其与C++的类比.
另外,请给我一些参考,其中给出了这些术语的清晰和清晰的描述(我试着看一下提供的帮助,但它对我没什么帮助,因为它对C++和Java来说有点类似).
引用安德烈·帕夫连科:
引入了MatOfXxx类(例如MatOfPoint)以避免在Java和本机内存之间冗余复制中间数据.例如,你可以获得一些大的Point作为一个OpenCV函数的结果,然后将它传递给另一个.
在C++中,我们使用std :: vector.但是在Java中使用ArrayList导致在返回这些点时将所有Points数据从本机OpenCV级别复制到Java,并在使用它们调用下一个OpenCV函数时将它们复制回来.因此,为了提高效率,我们在这种情况下切换到使用MatOfPoint类,这是一种1n或n1维度的Mat,它在每个元素中保持一个Point(即CV_32SC2或CV_64FC2类型).
您可能知道,Mat将所有数据保留在本机级别,因此这些对象可以在OpenCV调用之间传递而无需数据复制.但是,如果在某些时候您的Java代码中需要直接访问实际的Points数据,则需要使用toArray()和fromArray方法将数据显式传输到Java或从Java传输数据.
例如,要创建包含与现有MatOfKeyPoint中的点对应的点的MatOfPoint2f,您需要:
- 通过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
Run Code Online (Sandbox Code Playgroud)