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对象的大小.
编辑; 调整分辨率后,帧速率上升到一个非常可接受的水平.希望这种变化不会对空间性能产生太大影响,但我们会看到这一点.
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。
归档时间: |
|
查看次数: |
1042 次 |
最近记录: |