0

Image を Mat にロードしました:

Mat Mask = cvLoadImage(filename);

3744 X 5616 RGB 画像です。次のステップで、グレースケールに変換します。

cvtColor(Mask,Mask,CV_BGR2GRAY);

この後、後で完全なグレースケールを使用するように正規化します。

normalize(Mask,Mask,0,255,NORM_MINMAX,CV_8U);

今、特定のグレースケール値が必要で、いくつかの値でエラーが発生します:

for(int i=0;i<(Picture.rows);i++)
{
    for(int j=0;j<(Picture.cols);j++)
    {
Vec3b  masked = Mask.at<Vec3b>(i,j);
//some stuff
}
}

一部のピクセルで次のエラーが発生します。

OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3) - 1))*4) & 15) == elemSize1()) in unknown function, file c:\opencv\build\include\opencv2\core\mat.hpp, line 537

誰が私が間違ったことを教えてもらえますか? 一部のピクセル値にのみ表示されるのは奇妙です

編集: 追加情報: マスクをグレースケールとしてロードすると、すべて正常に動作します。しかし、 cvtColor() または Mat Mask = imread(filename,CV_LOAD_IMAGE_GRAYSCALE); を使用すると 画像にエラーが表示されます。非常に奇妙な...

4

1 に答える 1

2

あなたの問題は、バイナリイメージにアクセスしていることだと思います.at<Vec3b>(i,j). 代わりに、各ピクセルに.at<uchar>(i,j). cvtColor(Mask,Mask,CV_BGR2GRAY);3 チャンネルの BGR 画像を 1 チャンネルのグレースケール画像に変更します。.at<Vec3b>(i,j)3 チャンネルの画像にアクセスしようとすると、最終的にメモリ内の画像配列の最後を超えてしまい、問題が発生したり、これらのアサーションがトリップしたりします。

for ループの内部は次のようになります。

unsigned char masked = Mask.at<uchar>(i,j);
于 2013-10-13T16:15:02.193 に答える