アプリ版:「スタンプのみでお礼する」機能のリリースについて

cvLoadImageを使用するとプロセスが終了できません。

OpenCV1.1を使用して開発を行っているのですが、OpenCVの関数であるcvLoadImageとMFCのクラスであるCFileDialogを一緒に使用した場合、アプリケーションの終了時にプロセスが残ってしまいます。
デバッグ実行の場合、完全に終了まで至らない。
リリースビルドの実行ではタスクマネージャで確認する限りプロセスが残っています。

この現象は以下のコードを実行した場合発生しているようです。
逆に言えばこのコードを実行しなければ正常に終了します。

■現象の発生するコード

  IplImage* pImage ;
  CString strFilePath = "c:\\a.jpg";
  CFileDialog dlg(  TRUE,
            NULL,
            NULL,
            OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
            _T("すべてのファイル(*.*)|*.*||")
          ) ;
  if( IDOK == dlg.DoModal() ) {
    strFilePath = dlg.GetPathName() ;
    TRACE( "%s\n", strFilePath ) ;
    pImage = cvLoadImage( strFilePath , 1 ) ;
    cvReleaseImage( &pImage ) ;  
  }


http://questionbox.jp.msn.com/qa5084716.html
ここを読むと似たような現象で、回避方法としてOpenCV1.0にすると書かれています。
関数やコンパイラの環境、症状がやや異なるので、同じかどうかは分かりませんが、なんとかOpenCV1.1でCFileDialogを使用したいのです。
よい回避方法がありましたらお教えください。
よろしくお願いします。


■開発環境
・VC++6.0
・OpenCV1.1pre
・WindowsXP
OpenCV2.0への変更とVC++6.0以外のコンパイラへの変更は考えていません。

A 回答 (1件)

ちょっとぐぐった限りでは、バグのようなので、


http://sourceforge.net/tracker/?func=detail&aid= …
OpenCV1.0・2.0ではどうあがいても実現できず、
1.1でしか実現できない機能がある、という積極的な理由がある場合を
除いては、バージョンの変更をオススメします。

貼ったURLには回避方法らしきものは書いてあるものの、
バグはバグであって、完全に回避できていない可能性はあるので。
    • good
    • 0
この回答へのお礼

紹介していただいたサイトに書かれてあった回避方法は以下のような内容でした。

「::CoUninitialize() をアプリケーションの終了時に呼ぶ」

どうも、cvLoadImageではComの初期化を行っているのにもかかわらず、それを解放することを忘れているという感じのバグらしいですね。
本来CoInitializeとCoUninitializeはセットで、CoInitializeが実行されるとその回数分CoUninitializeも必要ということなので、念のためにclLoadImage関数を複数回実行して、終了時に1回CoUninitializeを呼ぶテストをしてみたところ、ちゃんと終了したようです。
とはいえ、バグはバグですので、お勧めのようにOpenCVのバージョンを変更できないか検討したいと思います。

ありがとうございました。

お礼日時:2010/04/01 14:05

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