如何翻译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;
}