dポイントプレゼントキャンペーン実施中!

VC++にてOpenCVを使い画像処理を行っている者です。

処理後の画像をMFCで作成したPictureBoxに表示したいのですが、
IplImageからBmpへの変換がうまくいきません。

//---------------------------------------------------------------

IplImage *img;
img = cvLoadImage(filename, 0); // 0: グレイスケールで読み込む
cvThreshold(img,img, 70, 255, CV_THRESH_BINARY_INV);//二値化

char* ColorBuf = (char*)calloc( sizeof(char), img->width * img->height * 4 );
for( int y = 0; y < img->height; y++ ) {
for( int x = 0; x < img->width; x++ ) {

ColorBuf[ y * img->width * 4 + x * 4 + 0 ] =
img->imageData[ y * img->widthStep + x * 3 + 0 ];
ColorBuf[ y * img->width * 4 + x * 4 + 2 ] =
ColorBuf[ y * img->width * 4 + x * 4 + 1 ]=
ColorBuf[ y * img->width * 4 + x * 4 + 0 ];
}
}
mbmp.CreateBitmap( img->width, img->height, 1, 32, ColorBuf );
free( ColorBuf );

((CStatic*)GetDlgItem( IDC_IMGSRC ))->SetBitmap ( mbmp );

cvReleaseImage( &img );
}
//---------------------------------------------------------------

今はPictureBoxに3つ縦に画像が表示されてしまってます。
何か改善点などがありましたらよろしくお願いいたします。

A 回答 (1件)

ColorBuf[ y * img->width * 4 + x * 4 + 0 ] =


img->imageData[ y * img->widthStep + x * 3 + 0 ];
ここが違いますよ
グレースケールなので チャンネル(プレーン)は1つしかありません
したがって

ColorBuf[ y * img->width * 4 + x * 4 + 0 ] =
img->imageData[ y * img->widthStep + x + 0 ];
といった具合に『 * 3 』を除去しましょう

定数でハードコードするより
img->imageData[ y * img->widthStep + x * img->nChannels + 0 ]
などした方がわかりやすいかも ・・・
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
無事に表示することができました。
またの機会がありましたらよろしくお願いいたします。

お礼日時:2008/11/20 14:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!