java - 如何将包含指针的 OpenCV-C++ 代码转换为 JAVA?

标签 java android c++ opencv

我目前正在将一些 C++ 代码翻译成 Java,用于 Android 应用程序。然而,我偶然发现了一些棘手的 C++ 代码(C++ 也不是我的主要语言)。下面是 C++ 代码。此函数计算 openCV imageFrame 中的图像梯度(灰度)。

cv::Mat computeMatXGradient(const cv::Mat &mat) {
  cv::Mat out(mat.rows,mat.cols,CV_64F);

  for (int y = 0; y < mat.rows; ++y) {
    const uchar *Mr = mat.ptr<uchar>(y);
    double *Or = out.ptr<double>(y);

    Or[0] = Mr[1] - Mr[0];
    for (int x = 1; x < mat.cols - 1; ++x) {
      Or[x] = (Mr[x+1] - Mr[x-1])/2.0;
    }
    Or[mat.cols-1] = Mr[mat.cols-1] - Mr[mat.cols-2];
  }
}

在这段代码中,我不知道如何解释第一个循环中的前两行:

    const uchar *Mr = mat.ptr<uchar>(y);
    double *Or = out.ptr<double>(y);

这里做了什么,我如何将它翻译成 Java 代码?我研究了“mat.ptr<>()”函数,但这也不是很有帮助。 (可以找到文档 here 。)关于指针的基本信息(如 here )我已经读过,但我仍然不明白如何阅读上面的行。除了使用的指针外,我也不太确定如何处理正在使用的“uchar”类型。这如何转化为 Java?

整个代码可以找到here .

我已经研究过从头开始实现 Matlab 梯度函数的方法,但这似乎要困难得多。 (是的,已经有关于此的主题(例如 here ),但该线程并未提供有关如何操作的实际答案。)

我真的希望有人能解释如何在 Java 中处理上面的 c++ 结构。到目前为止,我已经做了我能做的所有可能的研究,但我就是不知道如何用 Java 来做。 提前致谢!

编辑;最后,我已经能够通过使用双 for 循环来让它工作。代码如下。然而,它的效率要低得多。在 galaxy tab4 上,处理速率仅为每秒 1 帧左右。我没想到会得到完美的结果,但我希望它会更快一点。有谁知道下面的代码是否可以更有效地完成?即使是最小的变化也将是巨大的,因为算法中有大约六个这样的双 for 循环。

private static Mat computeXGradient (Mat mat) {
    //Mat output = new Mat(mat.rows(), mat.cols(), CvType.CV_64F);
    Mat output = new Mat(mat.rows(), mat.cols(), CvType.CV_32F);
    for (byte y = 0; y < mat.rows(); ++y) {
        Mat mr = mat.row(y);
        output.put(y,0, mr.get(0,1)[0] - mr.get(0,0)[0]);
        for (byte x = 1; x < mat.cols() - 1; ++x) {
            output.put(y,x, (mr.get(0,x+1)[0] - mr.get(0,x-1)[0])/2.0);
        }
    }
    return output;
}

我已经实现了多线程(实际强制使用更多处理器),正如您所见,我还缩小了我正在使用的 Mat 对象的大小。

编辑;调整分辨率后,帧率上升到一个非常可接受的水平。希望这种变化不会对空间性能产生太大影响,但我们会看到这一点。

最佳答案

mat.ptr(y)从矩阵中获取第 y 行。

同样,out.ptr(y)从输出矩阵中获取第 y 行。

就翻译而言,您可以在 Java 中创建一个 Row 类,或者只从 ptr 函数返回一个数组。

如果您还没有提供 Matrix 类,您可以将 Row 设为通用类型,就像这个库所做的那样。 (例如 Row<Integer>)

uchar (unsigned char) 大致翻译为 byte在 java 。它是一个 8 位(有符号)整数值。如果您想确保可以使用整个 0-255 范围,请改用 int。

关于java - 如何将包含指针的 OpenCV-C++ 代码转换为 JAVA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29720465/

相关文章:

java - JSP无法检测到java模型类中新添加的元素

java - 在java Activity 中循环遍历Android表格布局

Android - JSON 获取单一值

c++ - 允许用户命名文件名但将其保存在预定位置 - OSX

java - android系统会阻止FCM通知吗

java - 设计模式丰富的代码库?

java - 我试图通过 spring 框架将图像路径存储在 mysql 数据库中...但无法做到这一点.. :/

android - 是否可以将使用 ASE 创建的 Android 脚本用作典型的 Android 应用程序(例如,用 Java 编写)?

c++ - 关于 WINAPI 错误处理

c++ - 标准 vector 性能/替代