如何将包含指针的OpenCV-C++代码翻译成JAVA?

Mas*_*992 5 c++ java android opencv

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

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];
  }
}
Run Code Online (Sandbox Code Playgroud)

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

    const uchar *Mr = mat.ptr<uchar>(y);
    double *Or = out.ptr<double>(y);
Run Code Online (Sandbox Code Playgroud)

这里做了什么,我怎么能把它翻译成Java代码?我查看了'mat.ptr <>()'函数,但这也没有用.(文档可以在这里找到.)关于指针的基本信息(比如这里)我已经读过了,但我仍然没有得到如何阅读上面的行.除了使用的指针,我也不太确定如何处理正在使用的'uchar'类型.这如何转化为Java?

整个代码可以在这里找到.

我已经研究过从头开始实现Matlab的Gradient函数的方法,但这看起来要困难得多.(是的,已有关于此的主题(在此处),但此主题并未提供有关如何执行此操作的实际答案.)

我真的希望有人可以解释如何在Java中处理上面的c ++结构.到目前为止,我做了所有可能的研究,但我无法理解如何在Java中完成它.提前致谢!

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bar*_*ett 1

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

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

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

如果您尚未提供 Matrix 类,则可以将 Row 设置为泛型类型,就像此库所做的那样。(例如Row<Integer>

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