2011-07-12 8 views
3

OpenCVのに二値画像の幅とwidthStep異なる:私は次のようにcvLoadImageを使用してOpenCVのバイナリイメージをロード

IplImage* myImg=cvLoadImage(<ImagePath> ,-1); //-1 so that it is read as it is. 

Iチェック場合myImg->幅myImg-> widthStep、I両方ともわずかに異なる値を持つことに驚きました。次に、データセット内の他の画像を見ると、ほとんどの場合、2つの値が等しいことがわかりましたが、いくつかのかなりの数の画像では、2つの値がほとんど1または2の値でした。

私はチャネルの数が1より大きい場合にのみカラーイメージ用ですが、2つの値が異なります。そうでない場合は同じです。私が間違っている?誰もこの奇妙な行動に気付いたことはありますか?

ありがとうございます!

答えて

6

幅が4の倍数でない場合は、パフォーマンスと配置の理由から、4の倍数まで埋められます。したがって、 255その後、widthStepは256

3

画像のwidthstepは、次のように計算できるようになります:

IplImage *img = cvCreateImage(cvSize(318, 200), IPL_DEPTH_8U, 1); 

int width = img->width; 
int nchannels = img->nChannels; 

int widthstep = ((width*sizeof(unsigned char)*nchannels)%4!=0)?((((width*sizeof(unsigned char)*nchannels)/4)*4) + 4):(width*sizeof(unsigned char)*nchannels); 
0

次の擬似コードは@Nizar FAKHFAKHの回答に基づいて小さな断片です。それは基本的に同じことですが、少しはっきりしています(少なくとも私にとっては、ジェエ)。ここではそれが行く:ここ

 int size_row_raw = width * n_channels; 
     int rem = size_row_raw % 4; 
     int width_step = (rem == 0) ? size_row_raw : size_row_raw + rem; 

私はC#のためのsizeof(バイト)= 1のために真であると考え、そのサイズ(unsigned char型)= 1を、想定しています。この変数を前の擬似コードに追加したい場合は、変更は簡単です。最初の行を次のように変更してください:

int size_row_raw = width * sizeof(datatype_of_interest)* n_channels;

+0

c-apiはもう生きていない、これは死んだ話題です。あなたは思考に誤ったnoobsだけ、これはまだ有効なオプションであり、より多くの質問/回答の無限のカスケードを引き起こすことになります。 – berak

+0

@berakのコメントに感謝します。ご覧のとおり、私はこれで新しいです。私はちょうどそれが古いc-api(私のような)を使用することを余儀なくされている人々のために役立つことができると思った。ご意見ありがとうございます。 – ryuzakyl

+0

私は3行目を単純化すると信じています: 'int width_step = size_row_raw + rem;' –

関連する問題