プロが教えるわが家の防犯対策術!

VC++にて画像処理を行っています。

OpenCVのライブラリを使って画像処理をしようと考えているのですが、
処理した画像がMFCで作成したpitureBoxに表示の仕方が分かりません。

調べていくうちに、

「IplImage形式の画像を直接ウィンドウに描画することは出来ないので、
画像をDIBセクション形式に変換してWindows固有の描画処理を行うといい。」

ということが分かり、DIBセクション形式への変換には、IPLを入手し、
「iplConvertToDIB()関数」を使うということが分かりました。

このiplConvertToDIB()関数をつかって画像表示の方法を教えてはいただけないでしょうか?サンプルのソースなどありましたらよろしくお願いいたします。

A 回答 (2件)

 こんばんは。

補足いただきました。

>>このiplConvertToDIBSep関数を使うためには
>>IPLを入手しなくてはいけないのでしょうか?
>>OpenCVだけではいけないのでしょうか?
 はい。自力での変換も可能では有りますが、非常に面倒です。

>>また、どこで入手できるのか教えていただければ幸いです。
 此方に落ちていました。インストール後の設定も参考になると思います。
 http://chihara.naist.jp/people/2004/kenta-t/Open …
    • good
    • 0

 こんばんは。



 iplConvertToDIB()よりもiplConvertToDIBSep()の方が使い勝手が良いそうです。
 24ビットのDIBで表示するのが最も簡単です。
 以下参考程度に。

/////////////////////////////////////////////////////////////////////////////
// どこかでボタンが押された

//ファイルを読み込む 24ビット扱い
m_pIpl = ::cvLoadImage("ファイル名");

/////////////////////////////////////////////////////////////////////////////
// iplの後始末

CPictureBox::~CPictureBox()
{
::cvReleaseImage(&m_pIpl);
}

/////////////////////////////////////////////////////////////////////////////
// CPictureBox メッセージ ハンドラ

void CPictureBox::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト

// TODO: この位置にメッセージ ハンドラ用のコードを追加してください

//読めていないので引き返す
if(!m_pIpl)return;

//DIBのヘッダ iplを24ビットのDIBに変換する
BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER)}};
bmi.bmiHeader.biWidth = m_pIpl->width;
bmi.bmiHeader.biHeight = m_pIpl->height;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biPlanes = 1;

//DIBのバッファを割り当てる
char* pDIB = static_cast<char*>(::malloc(m_pIpl->imageSize));

//iplからDIBへ変換
::iplConvertToDIBSep(m_pIpl, &bmi.bmiHeader, pDIB, IPL_DITHER_NONE, IPL_PALCONV_NONE);

//DIBをウィンドウに描く
::SetDIBitsToDevice(dc, 0, 0, m_pIpl->width, m_pIpl->height, 0, 0, 0, m_pIpl->width, pDIB, &bmi, DIB_RGB_COLORS);

//DIBのバッファを後始末
::free(pDIB);

// 描画用メッセージとして CStatic::OnPaint() を呼び出してはいけません
}

この回答への補足

早速の回答ありがとうございます。
このiplConvertToDIBSep関数を使うためには
IPLを入手しなくてはいけないのでしょうか?
OpenCVだけではいけないのでしょうか?
また、どこで入手できるのか教えていただければ幸いです。
よろしくお願いいたします。

補足日時:2008/10/20 22:38
    • good
    • 0

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