gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:54:55 24 4
gpt4 key购买 nike

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

我能够编写简单的程序并运行示例。但是,当我尝试为高级问题编写一些代码时,例如模型姿势估计、相机校准例程等,我遇到了这个非常奇怪的困惑。某些在 C++ API 中名称非常直观的数据类型在 Java 中并不适用。因此,我面临着将我的功能从 C++ 移植到 Java 的巨大困难。我对这些功能感到非常困惑

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

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

此外,请给我推荐一些引用资料,其中给出了这些术语的清晰明了的描述(我尝试查看随附提供的帮助,但对我帮助不大,因为 C++ 和 Java 都有些相似) .

最佳答案

引用 Andrey Pavlenko 的话:

MatOfXxx classes (e.g. MatOfPoint) were introduced to avoid redundant copying of intermediate data between Java and native memory. E.g. you can get some large set of Points as the result of one OpenCV function and then pass it to another one.

In C++ we use std::vector for this. But use of ArrayList in Java caused copying all the Points data from native OpenCV level to Java when returning these Points and copying them back when calling the next OpenCV function using them. So for the sake of efficiency we switched to use of MatOfPoint class in such cases that is a kind of Mat of 1n or n1 dimensions that keeps a Point in each element (i.e. of type CV_32SC2 or CV_64FC2).

As you may know, Mat keeps all the data on native level, so such objects can be passed between OpenCV calls without data copying. But if in your Java code at some point you need direct access to actual Points data there are toArray() and fromArray methods to explicit transfer data to/from Java.

For example, to create a MatOfPoint2f containing the points corresponding to ones from existing MatOfKeyPoint you need:

  • load KeyPoints to Java via MatOfKeyPoint.toArray()
  • iterate through KeyPoint[] and create a corresponding Point[] (all of cv::Point, cv::Point2f and cv::Point2d are represented as org.opencv.core.Point in Java)
  • use MatOfPoint2f.fromArray() or c-tor MatOfPoint2f(Point...pa)to put your Points to native level

As for the C++ vs Java types correspondence:

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

关于android - OpenCv4Android 和 C++ 数据类型之间的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com