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タイプ「data」および「means」に対して上記のクラスを繰り返します。どうやってやるの?特に私はラインを行う方法がわかりません:

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

どうもありがとう。

4

2 に答える 2

1

OpenCVMatオブジェクトのピクセルにアクセスする簡単な方法は、at()演算子を使用することです。データ型が1チャネルのunsignedchar(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 に答える