Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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
如何翻译OpenCV-C++;包含指向JAVA的指针的代码? 我现在正在为一个Android应用程序翻译一点C++代码到java。我偶然发现了一个棘手的C++代码,但C++也不是我的主要语言。下面是c++代码。此函数用于计算openCV imageFrame中的图像渐变(灰度) cv::Mat computeMatXGradient(常数cv::Mat&Mat){ cv::垫出(垫行、垫列、cv_64F); 对于(int y=0;y_Java_Android_C++_Opencv - Fatal编程技术网

如何翻译OpenCV-C++;包含指向JAVA的指针的代码? 我现在正在为一个Android应用程序翻译一点C++代码到java。我偶然发现了一个棘手的C++代码,但C++也不是我的主要语言。下面是c++代码。此函数用于计算openCV imageFrame中的图像渐变(灰度) cv::Mat computeMatXGradient(常数cv::Mat&Mat){ cv::垫出(垫行、垫列、cv_64F); 对于(int y=0;y

如何翻译OpenCV-C++;包含指向JAVA的指针的代码? 我现在正在为一个Android应用程序翻译一点C++代码到java。我偶然发现了一个棘手的C++代码,但C++也不是我的主要语言。下面是c++代码。此函数用于计算openCV imageFrame中的图像渐变(灰度) cv::Mat computeMatXGradient(常数cv::Mat&Mat){ cv::垫出(垫行、垫列、cv_64F); 对于(int y=0;y,java,android,c++,opencv,Java,Android,C++,Opencv,在这段代码中,我不知道如何解释第一个循环中的前两行: const uchar *Mr = mat.ptr<uchar>(y); double *Or = out.ptr<double>(y); const-uchar*Mr=mat.ptr(y); 双*或=out.ptr(y); 这里正在做什么,如何将其转换为Java代码?我已经研究了'mat.ptr()'函数,但这也没有多大帮助。(可以找到文档。)关于指针的基本信息(比如)我已经读过了,但是我仍然不知

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

    const uchar *Mr = mat.ptr<uchar>(y);
    double *Or = out.ptr<double>(y);
const-uchar*Mr=mat.ptr(y);
双*或=out.ptr(y);
这里正在做什么,如何将其转换为Java代码?我已经研究了'mat.ptr()'函数,但这也没有多大帮助。(可以找到文档。)关于指针的基本信息(比如)我已经读过了,但是我仍然不知道如何阅读上面的行。除了使用的指针之外,我也不太确定如何处理正在使用的“uchar”类型。如何将其转换为Java

整个代码都可以找到

我已经研究过如何从头开始实现Matlab的梯度函数,但这似乎要困难得多。(是的,已经有了关于这方面的主题(e.x.),但这篇文章并没有提供如何做到这一点的实际答案。)

我真的希望有人能解释如何用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;
}
private static Mat computeXGradient(Mat-Mat){
//Mat输出=新Mat(Mat.rows()、Mat.cols()、CvType.CV_64F);
Mat输出=新Mat(Mat.rows()、Mat.cols()、CvType.CV_32F);
对于(字节y=0;y
我已经实现了多线程(实际需要使用更多处理器),正如您所见,我还缩小了正在处理的Mat对象的大小

编辑;在调整分辨率后,帧速率上升到一个非常可接受的水平。希望此更改不会对空间性能造成太大影响,但我们将对此进行了解。

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

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

至于转换,您可以在Java中创建一个Row类,或者只从ptr函数返回一个数组

如果尚未提供矩阵类,则可以将行设置为泛型类型,就像此库所做的那样。(例如,


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

为惊喜做好准备。uchar不会将1:1转换为Java的字节,这是一个有符号(!)的8位量。谢谢您的回答!最后我发现我可以做一个双for循环,得到数组中存储在(y,x)的第一个条目。你的回答帮助我到达那里;)然而,在JAVA中,它的效率确实非常低。这可能与为什么要在C(++)中使用指针有关吗?它们是否更高效?很难说为什么java中的双循环似乎比C++中的等效代码效率低,而不需要看到代码。语言本身没有任何隐含的东西会导致显著的差异。嗨,我在我的原始文章中添加了我在Java中提出的for循环。我应该提到我正在Android(galaxy tab4)设备上运行我的代码,我正在构建一个眼动跟踪器。但是,我仍然期望得到比现在更好的结果(.5 fps)。例如,我知道,在2011年完成的一项研究中,一个类似的算法在iPad2上达到了1.5fps。顺便说一句,可以从纯java获得,您可能不需要任何jni魔法。
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;
}