不久前得到了 O'Reilly 的《Learning 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 );
}
这是此代码的包含说明:
在计算指向矩阵的指针时,请记住矩阵元素数据是一个并集。因此,在取消引用该指针时,必须指明联合的正确元素,才能获得正确的指针类型。然后,要偏移该指针,您必须使用矩阵的 step 元素。如前所述,step 元素以字节为单位。为了安全起见,最好以字节为单位进行指针运算,然后将 > 转换为适当的类型,在本例中为浮点数。尽管 CVMat 结构具有 > 高度和宽度的概念以与旧的 IplImage 结构兼容,但我们 > 使用更新的行和列代替。最后,请注意,我们为 > 每一行重新计算 ptr,而不是简单地从开头开始,然后在每次读取时递增该指针。这似乎有些过分,
但是我无法将其转换为 JavaCV。ptr 字段(指针)似乎是一个浮点数,这让我感到困惑。我认为它实际上不是一个“指针”,而是一个添加每个像素值的值?或者它实际上是一个指针,它的 s 值找到给定行中所有列的总和?
无论如何,如果有人为我发布一些用于等效循环的 JavaCV 代码,我将不胜感激。我知道还有其他方法可以访问 CvMat 中的每个像素,但是 AFAIK 它们的效率都较低或不准确。