0

ビデオフレームをグレースケールに変換することで得られるopenCVマトリックス要素にアクセスしようとしています。私のコードは次のようなものです:

int C = 3; 
cv::Mat grayPrevious;
cv::cvtColor ( previousFrame, grayPrevious, CV_RGB2GRAY  );
double* grayPtr = grayPrevious.ptr <double> ();

double mean [600][800][3];

///... // set some values to mean here

for ( int i = 0; i < 600; i ++ )
{
    for ( int j = 0; j < 800; j ++ )
    {
        for ( int m = 0; m < C; m ++ )
        {
            diff [i][j][m]= abs(grayPtr[ 800* (i-1)+j] - mean[i][j][m]);
        }

    }
}

しかし、for ループでクラッシュします。これはデータ型に関連するものですか?どうすれば変更できますか?

また、2 つ目の質問は、「grayPrevious.at」を使用して、grayPrevious マトリックスの要素を画面に表示しようとしたのですが、「double」の場合は「-5.235125e+30」、「double」の場合は「-11242433」のような値が表示されます。イント」。これも私を混乱させます。0 から 255 の間の値が表示されることを期待していました。

4

2 に答える 2

2

グレースケール画像を扱うuchar代わりに、intまたはそれを使用する必要があります。double(キャストしucharて印刷できますcout<<(int)grayPrevious.at<uchar>(i,j);:)

ピクセルに直接「難しい方法」でアクセスしようとしている理由はありますか?grayprevious.at<uchar>(i,j)デバッグして直接ピクセルアクセスを使用する方が簡単な方法(画像が800x600であると仮定)を実行できます。

編集:私はそれがすべきだと思います:

uchar* grayPtr = grayPrevious.ptr <uchar> ();その後grayPtr[grayPrevious.cols*i+j];

あなたもすることができますgrayPrevious.data[grayPrevious.cols*i+j];(それでも直接アクセスなしでptr

于 2012-10-05T15:21:29.337 に答える
1

この行が問題なのかもしれないと真剣に疑っています

 for ( int m = 0; m < C; m ++ )

ループが実行されているときに C の値を確認してください。配列の範囲外の要素にアクセスしようとすると、おそらく意味があります。ほとんどの場合、それは 3 を超えています。また、プリインクリメント演算子を使用しないのはなぜですか。この例では関係ないかもしれませんが、ポスト インクリメント オペレータではなくプレインクリメント オペレータを使用することをお勧めします。

于 2012-10-05T15:17:06.590 に答える