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

このQ&Aのポイント
  • OpenCVのcvLoadImageとMFCのCFileDialogを一緒に使用すると、アプリケーション終了時にプロセスが残る現象が発生する
  • この現象は特定のコードを実行した場合に起こり、OpenCV1.0への変更で回避することができる
  • VC++6.0とOpenCV1.1を使用して開発し、OpenCV1.1でCFileDialogを使いたいが、回避方法が分からない
回答を見る
  • ベストアンサー

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

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以外のコンパイラへの変更は考えていません。

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

ちょっとぐぐった限りでは、バグのようなので、 http://sourceforge.net/tracker/?func=detail&aid=2783877&group_id=22870&atid=376677 OpenCV1.0・2.0ではどうあがいても実現できず、 1.1でしか実現できない機能がある、という積極的な理由がある場合を 除いては、バージョンの変更をオススメします。 貼ったURLには回避方法らしきものは書いてあるものの、 バグはバグであって、完全に回避できていない可能性はあるので。

shouko0918
質問者

お礼

紹介していただいたサイトに書かれてあった回避方法は以下のような内容でした。 「::CoUninitialize() をアプリケーションの終了時に呼ぶ」 どうも、cvLoadImageではComの初期化を行っているのにもかかわらず、それを解放することを忘れているという感じのバグらしいですね。 本来CoInitializeとCoUninitializeはセットで、CoInitializeが実行されるとその回数分CoUninitializeも必要ということなので、念のためにclLoadImage関数を複数回実行して、終了時に1回CoUninitializeを呼ぶテストをしてみたところ、ちゃんと終了したようです。 とはいえ、バグはバグですので、お勧めのようにOpenCVのバージョンを変更できないか検討したいと思います。 ありがとうございました。

関連するQ&A

  • libdecodeqrをVC6.0のダイアログベースアプリで使いたいの

    libdecodeqrをVC6.0のダイアログベースアプリで使いたいの libdecodeqrをVC6.0のダイアログベースアプリで使いたいのですが、以下のような簡単なコードを書いたのですが、リンクで「error LNK2001: 外部シンボル *** は未解決です」となり、エラーになります。 OpenCVのインストールや設定はできております。 また、libdecodeqrのサンプルにあるsimple,webcam共にビルドし動作するのを確認できています。 // 画像読み込み IplImage* pImage = NULL ; pImage = cvLoadImage( strFilePath, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR ) ; // OPEN QrDecoderHandle hQRDecoder = qr_decoder_open() ; // ちょっとした処理 // CLOSE qr_decoder_close( hQRDecoder ); cvReleaseImage( &pImage ) ; よろしくお願いします。

  • CFileDialogで保存したい

    VC++でMFCのCEditViewを利用して作るテキストエディタ(プロジェクト名:Cell Compiler)に、最初からついているやつとは別にテキストの保存機能をつけたいのですが、どうすればよいですか? とりあえずCell Compilerdoc.cppファイルの中に、下記のような関数を作ってみたのですが(作る場所違う?)、その後が分かりません。 void CCellCompilerDoc::OnFileSaveProject() { CFileDialog dlg( FALSE, "*.*", "test.cell",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"cellファイル (*.cell)|*.cell|All Files (*.*)|*.*||", NULL); if( dlg.DoModal() == IDOK) { dlg.GetFileExt(); dlg.GetFileName(); dlg.GetFileTitle(); dlg.GetPathName(); } } 多分、if文の中に、保存する処理を加えるのかな?と思っているのですが、どうですか?ちなみに上記のソース追加以外は、何もいじってません。よろしくお願いします。

  • ファイルダイアログでのファイルの複数選択について

    VC++6.0でプログラムをしているのですが、CFileDialogクラスのコモンダイアログでファイルを開くときに、ファイルを複数選択できるようにしています。 しかし、試してみると14枚までしか開くことができません。プログラムは以下のとおりです。 CFileDialog dlg(TRUE, "bmp", "*.bmp", OFN_ALLOWMULTISELECT); if (dlg.DoModal() != IDOK) { return; } ファイルを15枚以上選択するとif文の中のreturnに入って関数を抜けてしまいます。原因が何なのか分かる方教えてください。

  • メインダイアログを表示させずにファイル選択ダイアログを表示

    VC++2005のMFCダイアログベースでプログラムを作成しています。 自動生成されたプログラムを何も変更しないまま実行すると、 メインのダイアログが表示されますが、 そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。 自分で実装しビルド実行したところ、期待動作をしましたが、 ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。 エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、 ご教示お願い致します。 【変更実装(エラー発生)】 BOOL CtestApp::InitInstance() { … CtestDlg dlg; m_pMainWnd = &dlg; // INT_PTR nResponse = dlg.DoModal(); //コメントアウト dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数 //if (nResponse == IDOK) //コメントアウト //else if (nResponse == IDCANCEL) //コメントアウト … } void CtestDlg::OnBnClickedButton1() { CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); … }

  • プロセスが終了されたかどうか調べる関数を教えてください。

    まずは下のC++のソースをご覧ください。 ------------------------------------------------ PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo = { 0 }; printf ("Start of Proc\n"); CreateProcess ( NULL, "c:\proc01.exe", NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInfo) printf ("End of Proc\n"); ------------------------------------------------ この処理でCreateProcessで指定された"c:\proc01.exe"が起動されて 終了した時に、下のprintf()関数が実行されるのようにしたいのですが、 そのような処理をするAPI関数、またはC++関数をご存知ないでしょうか?

  • サービスEXEのプロセス終了について

    VC6.0 ATL COM AppWizard で作成したWindowsサービスについて質問です。 サービスが停止できなかった場合など、サービスEXEをタスクマネージャからプロセスの終了したいのですが、 Windows2000の場合、「アクセスが拒否されました。」と表示され、終了できません。 サービスEXEをタスクマネージャから終了できるのか、またそのために必要なコードをご教授願います。 サービス関連のロジックは ATL COM AppWizard で作成されたまま使用しております。

  • プロセスがタスクマネージャーに残るのは、なぜ?

    vbのプログラムから、GetExitCodeProcessとDo Whileを使用し外部プログラム(メモ帳など)の実行、監視しています。何かの表示しに、外部プログラムが終了しているにもかかわらず終了コードが取れないことがあり、タスクマネージャーを見ると、プロセスが残っている状態です。 なぜ、終了コードが取れずに、プロセスが残るのでしょうか? 何か参考があればよろしくお願いします。

  • EXCEL終了後にたまにプロセスが残っている。

    最近、EXCEL終了後にたまにプロセスが残っている状態になり、使用が不便になりました。 ネットで検索すると、VBを使用後にそのような現象になる場合があるそうですが、VBは使用していません。なるようになった原因は解りませんがせんが、現在の状態を解消する方法をご存知の方は、いらしゃらないでしょうか。 宜しくお願いします。 office2000を使用しています。 windows xp

  • プロセスを終了しないと再起動しない現象について

    普段はパソコンが正常に動いているのですが、ある時急に再起動し、 通常の画面まで一応来るのですが、その後何をやってもパソコンが常に忙しい状態みたくなり、CPU使用率等を見ても低く、負担はないのではないかと思うのですが、殆どの操作が反応なくなり、ファイルなどを開く操作さえかなり重くなり、再起動以外にほぼ出来なくなります。しかも再起動する際に、今起動していると思われるプロセスが15秒くらいに一回ずつ終了しますか?と出てきて、それを一回一回終了していって、何かのプロセスの名前が出てきて、それを終了させるとようやく再起動します。一個一個プロセスを終了させていって20個くらい終了しないと再起動しないのですが、これは一体何なのでしょうか?パソコンに負担がかかっていてなるのでしょうか?この現象後再起動すると正常に戻ります。この現象はそんなに頻繁ではないのですが、一ヶ月に一回くらいはなります。原因が分かる方教えて頂けますでしょうか? よろしくお願い致します。 ちなみにVAIOのVGC-V171を使っています。 20個くらい順番に

  • VC++6.0,MDI,子ウィンドウのタイトルが変わる!?

    VC++6.0でMDIプログラムを作成しているものです. 子ウィンドウをダブルクリックすると「ファイルを開く」のコモンダイアログを呼び出し,そこに選択した画像ファイルを表示させるプログラムを作ったのですが,ついでにタイトルバーに開いたファイル名を以下のようにして表示させました. // Viewクラスにて CFileDialog dlg(TRUE, "bmp", "*.bmp",               OFN_HIDEREADONLY|         OFN_OVERWRITEPROMPT,        "BITMAP(*.bmp)|         *.bmp|JPEG(*.jpg)|         *.jpg||"); if (dlg.DoModal() != IDOK) { return; } GetParent()->SetWindowText(dlg.GetFileName()); そして,画像を表示したウィンドウとは別のウィンドウをアクティブにすると,タイトルバーに表示したファイル名がウィンドウを生成したときのタイトルに戻ってしまいます. 子ウィンドウが何個あっても,表示している画像のファイル名をタイトルバーに表示したいのですが,どうすればいいのですか?

専門家に質問してみよう