不久前得到了 O'Reilly 的《学习 OpenCV》一书,从那时起,我一直忙于将我看到的所有示例代码从 OpenCV 转换为 JavaCV,通常还会进行一些我自己的修改。一直以来,我都试图尽可能保持纯 OpenCV(C 语言)代码并避免使用 Java。例如,我直接通过JavaCV中的OpenCV highgui包实现了所有界面元素,而不是通过Java Swing。通过这样做,我希望能够在相对较短的时间内学习 OpenCV 库和一些 C 语言,并建立一个有用的函数库,如果我决定稍后切换到纯 OpenCV,我将能够轻松地将其转换为 C 语言。
无论如何,我对 C 的了解很少,有时在处理指针时会遇到麻烦。本书推荐以下代码作为迭代 3 通道矩阵的最佳方法:
float sum( const CvMat* mat ) {
float s = 0.0f;
for(int row=0; row<mat->rows; row++ ) {
const float* ptr = (const float*)(mat->data.ptr + row * mat->step);
for( col=0; col<mat->cols; col++ ) {
s += *ptr++;
}
}
return( s );
}
以下是该代码的解释:
当计算矩阵中的指针时,请记住矩阵元素数据
是一个联盟。因此,当取消引用该指针时,必须指示正确的
联合的元素以获得正确的指针类型。然后,为了抵消
指针,必须使用矩阵的步骤元素。如前所述,该步骤
元素以字节为单位。为了安全起见,最好以字节为单位进行指针算术,然后转换为适当的类型,在本例中为 float。尽管 CVMat 结构具有高度和宽度的概念以与旧的 IplImage 结构兼容,但我们还是使用更新的行和列。最后,请注意,我们为 > 每一行重新计算 ptr,而不是简单地从开头开始,然后递增该指针
每次阅读。这可能看起来有些过分,但因为 CvMat 数据指针可以
指向较大数组中的 ROI,无法保证数据在行之间连续。
但是我在将其转换为 JavaCV 时遇到问题。 ptr 字段(指针)似乎是一个浮点数,这让我感到困惑。我认为它实际上不是一个“指针”,而是一个每个像素值相加的值?或者它实际上是一个指针,s 值可以找到给定行中所有列的总和?
不管怎样,如果有人为我发布一些等效循环的 JavaCV 代码,我将不胜感激。我知道还有其他方法可以访问 CvMat 中的每个像素,但据我所知,它们都效率较低或不准确。
您提供的特定示例将被最佳地转换为 Java 作为
float sum(CvMat mat) {
final int rows = mat.rows();
final int cols = mat.cols();
final int step = mat.step()/4;
FloatBuffer buf = mat.getFloatBuffer();
float s = 0.0f;
for (int row = 0; row < rows; row++) {
buf.position(row * step);
for (int col = 0; col< cols; col++) {
s += buf.get();
}
}
return s;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)