0

我正在尝试将以下 c++ 行转换为 OpenCV 矩阵运算(也是 c++):

double myCode::calculate ( int i, int au )
{
    double k;
    for ( int j = 0; i < N; i ++ );
    {
         k += fabs(data[i][j] - means[au][j]);            
    }
}

我想将“数据”和“手段”定义为 openCV 矩阵类型,例如:

cv::Mat data ( NUMBER_OF_OBSERVATIONS, N, CV_8UC3 );
cv::Mat means = cv::Mat.zeros ( 5, N, CV_8UC3 );

然后为这个 cvMat 类型“数据”和“手段”重复上面的类。我怎样才能做到这一点?特别是我不知道该怎么做:

k += fabs(data[i][j] - means[au][j]); 

非常感谢。

4

2 回答 2

1

访问 OpenCVMat对象中的像素的一种简单方法是使用at()操作符。如果您的数据类型是 1 通道 unsigned char ( CV_8UC1),您可以简单地执行以下操作:

k += fabs(data.at<uchar>(i,j) - means.at<uchar>(i,j)); //works for CV_8UC1 type

但是,您有 3 个通道(R、G、B),由C3您的CV_8UC3数据类型决定。因此,以下是您k += fabs(...)在每个频道上的单独操作:

//for CV_8UC3 type
k += fabs(data.at<cv::Vec3b>(i,j)[0] - means.at<cv::Vec3b>(i,j)[0]); // Blue Channel
k += fabs(data.at<cv::Vec3b>(i,j)[1] - means.at<cv::Vec3b>(i,j)[1]); // Green Channel
k += fabs(data.at<cv::Vec3b>(i,j)[2] - means.at<cv::Vec3b>(i,j)[2]); // Red Channel

这篇文章提供了关于像素访问的进一步解释。

于 2012-10-02T16:20:43.407 回答
1

你可以简单地写

double myCode::calculate ( int i, int au )
{
    cv::Scalar res = sum(avg(data(RowRange(i)) - means(RowRange(au))));
    return res[0] + res[1] + res[2]; // sum all the channels together
}

请注意,这RowRange()实际上不是正确的语法 - 查看 OpenCV 文档以了解 的正确用法Range(),但这就是想法。

于 2012-10-02T17:59:59.707 回答