c ++类和OpenCV矩阵操作之间的转换

时间:2012-10-02 16:06:24

标签: c++ opencv for-loop matrix type-conversion

我正在尝试将以下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]);            
    }
}

我想将“data”和“means”定义为openCV矩阵类型,如:

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

然后为此cvMat类型“data”和“means”重复上述类。我怎样才能做到这一点?特别是我不知道该怎么做:

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

非常感谢。

2 个答案:

答案 0 :(得分:1)

使用Mat运算符访问OpenCV at()对象中的像素的简单方法。 如果您的数据类型是1通道无符号字符(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

This post提供了有关像素访问的进一步说明。

答案 1 :(得分: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(),但这就是理念。