MFCにおけるOpenCVの高速適用

3191 ワード

回転:http://www.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV
SDIプロジェクトの作成
Visual C++6.0を使用しているので、このチュートリアルではVC 6でのプレゼンテーション操作を説明していますが、他のバージョンのVCを使用すると、それほど悪くないと思います.まず、VCのウィザードに従って、デフォルトのMFCのプロジェクトを作成します.注意して、SDIドキュメントでサポートされているものを選択します.同時に、「use MFC As a static library」(MFCでOpenCVを使用したメモリの漏洩問題を防止する)を選択したほうがいいです.具体的には、次の2枚の図を参照して、このようにしてください.その後、基本的なMFCフレームワークの作成が完了します.
[編集]
OpenCVライブラリのサポートへの参加
OpenCVに必要なヘッダファイルとライブラリファイルを追加します.次の図に示すように、ライブラリファイルを追加します. cxcore.lib cv.lib highgui.lib 
[編集]
Docクラスに変数を追加
*Doc、すなわちドキュメントクラスの定義を見つけ、先頭にHighGui.hのヘッダファイルを追加し、変数CImage m_を追加します.image;.
VC 6を使用していない場合は、私のチュートリアルに従ってコンパイルできない可能性があります(私のチュートリアルでは、m_imageはprotectedタイプに設定されています)、解決策はm_イメージのタイプはpublicに設定されており、今後はpublic修飾子を使用することをお勧めします.具体的なバグレポートと分析はこちらをご覧ください:public修飾子の使用をお勧めします
[編集]
ダミー関数の追加
2つの関数を追加して、それぞれピクチャファイルを開くこととピクチャファイルを保存することに使用します.追加プロセスは下図の右クリックメニューを参照してください.
関数OnOpenDocumentとOnSaveDocumentをそれぞれ次のコードで追加します.
BOOL CSDI OpenCVDoc::OnOpenDocument(LPCTSTR lpszPathName){
    if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE;
    // TODO: Add your specialized creation code here
    m_image.Load(lpszPathName);
    return TRUE;
}
BOOL CSDI OpenCVDoc::OnSaveDocument(LPCTSTR lpszPathName){
    // TODO: Add your specialized code here and/or call the base class
    m_image.Save(lpszPathName);
    return TRUE;
   // return CDocument::OnSaveDocument(lpszPathName);
}
注意
,上は本来return CDocument::OnSaveDocument(lpszPathName);しかし、後で問題が発見され、画像を保存すると、保存後の画像の大きさが0になり、return TRUEに変更される.問題はありません.具体的にはフォーラムの討論を見てください.  http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4932&p=18215#p18215
[編集]
Viewクラスに表示画像コードを追加
ビュークラスに必要な画像表示コードを追加し、主にOndrawに追加します.
void CSDI_OpenCVView::OnDraw(CDC* pDC)
{
	CSDI_OpenCVDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CImage & img = pDoc ->m_image;
	CRect r;
	GetClientRect (&r);
		img.DrawToHDC(pDC->GetSafeHdc() ,r);
}
プログラム全体をコンパイルすることで、「メニューを開く」ことで画像を開き、MFCのViewクラスに表示することができます.
2010-12-28重要更新
OpenCV 2.2では、元のCvvImageクラス全体を削除してしまうため、MFCでの使用に多くの不便をもたらすため、opencv 2.1のコードを事前にopencv 2.1のコードの方法で解決することができます(hファイルとcppファイルを作って、あなたのプロジェクトに入れて一緒にコンパイルすればいいです).具体的な方法とファイルの内容は、以下を参照してください. Re:OpenCV 2.2でCImage(CvImage)がキャンセルされ、MFCの下に画像を表示するのに良い方法が少なくなった.
[
感謝と後記と関連討論
ドキュメントはUser:Ollydbg 23によって書かれています.また、私が整理した本フォーラムのエッセンスエリアも、wikiの形式で、ここに置いてあります.もし疑問があれば、元のテーマの下に行って返事をして討論に参加することができます. 【オリジナル】MFCでのクイックアプリケーションOpenCVチュートリアル画像が大きすぎてviewに入れられない解決策については、feixiaolinの投稿を見てください. Opencvデータ読み書き操作+画像ノイズ+MFC下OpenCVソースコード および スクロールバーを挿入する方法
OpenCVプロット関数DrawToHDCの簡単な説明Opencv 1.0バージョンでは、上記のcannyの方法を使用して、単一チャネルピクチャが開かないエラーがあります.具体的な理由は、ここを参照してください.これは主にopencv 1.0のバグによるものです.理由Opencv 1.1バージョンで使用すると、MFCのプログラムが終了できない可能性がありますので、解決策はこちらをご覧ください プログラムが正常に終了できないなお、CImageは実はCvvImageの2つを直接置き換えて使用することができる.OLEエラーダイアログの問題は、こちらをご覧ください OLEの問題をどのように解決するかのフォーラム討論[
ネットワークその他のOpenCVリソース
WxWidget GUIインタフェースでOpenCVを使用する例 mangoエディタOpencvコードを自動的に生成できる CvPreProcessor