###前提・実現したいこと
OpenCVのcv::Mat型で得たグレースケール画像を、MFCのPicutureコントロールに表示したい。
よろしくお願いいたします。
※グレースケール画像はcv::MatのコンストラクターにおけるtypeをCV_8UC1としたものです。
###発生している問題・エラーメッセージ
グレイスケールの画像が壊れて表示される。
具体的には写っているものの影のようなものは見えるが、よくわからない色がついた状態で表示される。
###該当のソースコード
c++
1void DrawImageOnPicture( cv::Mat& img) 2{ 3 // 出力サイズ 4 CRect rc; 5 GetDlgItem(IDC_IMAGE)->GetClientRect(&rc); 6 cv::Size size(rc.Width() & ~0x03, rc.Height() & ~0x03); 7 cv::flip(img, img, 0); 8 // BitMap情報 9 BITMAPINFO info = {}; 10 info.bmiHeader.biBitCount = 8; 11 info.bmiHeader.biWidth = size.width; 12 info.bmiHeader.biHeight = size.height; 13 info.bmiHeader.biPlanes = 1; 14 info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 15 info.bmiHeader.biCompression = BI_RGB; 16 // ピクチャコントロールへの描画 17 CDC* dc = GetDlgItem(IDC_IMAGE)->GetDC(); 18 HDC dcHndr = dc->GetSafeHdc(); 19 StretchDIBits(dcHndr, 20 0, 0, size.width, size.height, 21 0, 0, size.width, size.height, 22 img.data, &info, DIB_RGB_COLORS, SRCCOPY); 23 24 ReleaseDC(dc); 25}
実際には少し異なりますがPictureコントロールまでの流れはほぼこのままです。
こちらのサイトのコードを参考に作成した関数です。
###試したこと
MSDNのBITMAPINFOHEADER 構造体のページを参照してみてもいまいち理解できませんでした。
グレースケール画像をcv::imwrite()で出力したものには問題がないことを確認済みです。
cv::Mat newImg( img.size, CV_8UC3);で定義したものに無理やりモノクロのカラー画像データを作る処理をはさむことも考えましたが、無駄な処理をはさむ方法に逃げる他に、よりよい方法をご教授願けないかと質問させていただいています。
###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2008 SP1
Windows 7 Professional SP1
OpenCV 2.4.6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/15 01:42