2012-10-02 53 views
0

之间我试图以下C++线转换成OpenCV的矩阵运算(这也是C++):转换C++类和OpenCV矩阵运算

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]); 

非常感谢。

+0

这可能是有意义的删除';'就行了'for'循环的开始。另外,'cv :: Mat.zeros'实际上应该是'cv :: Mat :: zeros' – solvingPuzzles

+0

我误写了“;”在这里,但在我的代码中没有“;”在for循环行中,除了用“cv :: Mat :: zeros”替换了“cv :: Mat.zeros”,但“fabs”函数仍然无法工作。 –

回答

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()的正确使用,但是这是想法。

+0

谢谢你的回答,但它说“总和”是未定义的。但是我已经包含“math.h”和“stdio.h”。这可能是过低的错误,但我仍然无法解决它。你有什么建议吗? –

+0

总和来自opencv core try cv :: sum(cv :: abs(...)) – Sam

+0

再次感谢你。我用“cv :: sum(cv :: abs(...))”替换了“sum(avg(...))”,但现在它说“没有合适的从cv :: Scalar到double的转换函数存在” 。我认为cv :: sum返回一个cv :: Scalar,但是我的类是双重类型的。我需要你的帮助,谢谢。 –

1

访问像素的OpenCV Mat对象的简单方法是与操作者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提供了有关像素访问进一步的解释。

+0

我试过你的代码,但它说:“Vec3b”没有定义。你有什么主意吗?谢谢。 –

+0

尝试宣告'使用命名空间CV;'你'.cpp'文件的顶部,或者与CV''替换:: Vec3b' Vec3b'。 – solvingPuzzles

+0

我在上面的代码中用'cv :: Vec3b'替换了'Vec3b'。让我知道这个是否奏效。 – solvingPuzzles