Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCv4Android和C+之间的混淆+;数据类型_Android_Opencv - Fatal编程技术网

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

OpenCv4Android和C+之间的混淆+;数据类型,android,opencv,Android,Opencv,我正在尝试使用OpenCv4Android为Android设备编写一些应用程序。早些时候,我使用的是Android NDK和C++本地代码。但这项技术并不十分清晰。因此,我转而使用OpenCv 2.4.4版本附带的最新Java API 我能够编写简单的程序并运行示例。但是,当我试图为高级问题编写一些代码时,比如模型姿态估计、相机校准例程等,我遇到了这种非常奇怪的困惑。在C++ API中,一些名字非常直观的数据类型在它们的java对应中并不真正适合。因此,我的功能从C++到java都面临着巨大的困

我正在尝试使用OpenCv4Android为Android设备编写一些应用程序。早些时候,我使用的是Android NDK和C++本地代码。但这项技术并不十分清晰。因此,我转而使用OpenCv 2.4.4版本附带的最新Java API

我能够编写简单的程序并运行示例。但是,当我试图为高级问题编写一些代码时,比如模型姿态估计、相机校准例程等,我遇到了这种非常奇怪的困惑。在C++ API中,一些名字非常直观的数据类型在它们的java对应中并不真正适合。因此,我的功能从C++到java都面临着巨大的困难。我在这些职能方面面临着彻底的混乱

    < LI> PoT2F(在C++中)-MatoPosit2f(爪哇)< /LI>
  • Point3f(在C++中)-MatOfPoint3f(在Java中)
  • 第2点(Java)
  • 第3点(Java)
请帮助我理解OpenCV java中使用的术语及其与C++的类比。

也请给我一些参考,在这里给出了清晰和清晰的描述这些术语(我试着看提供的帮助,但它没有帮助我,因为它有点类似于C++和java)。< /P> < P> <强>引用Andrey Pavlenko:< /强>

引入了MatOfXxx类(例如MatOfPoint)以避免冗余 在Java和本机内存之间复制中间数据。例如,你 可以通过一个OpenCV函数获得一些大的点集 然后把它传给另一个

在C++中,我们使用STD::向量 为了这个。但是在Java中使用ArrayList会导致 将所有点数据从本机OpenCV级别复制到Java时 返回这些点,并在调用下一个 OpenCV函数使用它们。所以为了提高效率,我们换了 在这种情况下使用MatOfPoint类,这是一种1n的Mat 或n1尺寸,在每个元素中保留一个点(即类型 CV_32SC2或CV_64FC2)

您可能知道,Mat保留所有数据 本机级别,因此此类对象可以在OpenCV调用之间传递 没有数据复制。但是如果在Java代码中的某个点上需要 直接访问实际点数据有toArray()和fromArray 方法显式地将数据传输到Java或从Java传输数据

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

  • 通过MatOfKeyPoint.toArray()将关键点加载到Java
  • 迭代关键点[],并创建相应的点[](所有cv::Point、cv::Point2f和cv::Point2d都表示为 Java中的org.opencv.core.Point)
  • 使用MatOfPoint2f.fromArray()或c-tor MatOfPoint2f(Point…pa)将您的点设置为本机级别
<>关于C++与java类型对应关系:

vector:MatOfPoint
向量:MatOfPoint2f
向量:MatOfPoint3
向量:MatOfPoint3f
向量:MatOfKeyPoint
向量:匹配
向量:MatOfRect
向量:MatOfByte
向量:MatOfByte
媒介:马蹄雀
矢量:马托夫洛特
向量:MatOfDouble
病媒:Matofind4
病媒:Matofloat4

我在OpenCv官方论坛上问了同样的问题。答案是这样的。请参考链接-我建议将来参考,您将答案与链接一起发布并接受。这样,这个问题将从未回答的列表中删除,其他人将找到答案。这是一个重要的问题,对于谁开始使用OpenCV 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