
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以外のコンパイラへの変更は考えていません。
No.1ベストアンサー
- 回答日時:
ちょっとぐぐった限りでは、バグのようなので、
http://sourceforge.net/tracker/?func=detail&aid= …
OpenCV1.0・2.0ではどうあがいても実現できず、
1.1でしか実現できない機能がある、という積極的な理由がある場合を
除いては、バージョンの変更をオススメします。
貼ったURLには回避方法らしきものは書いてあるものの、
バグはバグであって、完全に回避できていない可能性はあるので。
紹介していただいたサイトに書かれてあった回避方法は以下のような内容でした。
「::CoUninitialize() をアプリケーションの終了時に呼ぶ」
どうも、cvLoadImageではComの初期化を行っているのにもかかわらず、それを解放することを忘れているという感じのバグらしいですね。
本来CoInitializeとCoUninitializeはセットで、CoInitializeが実行されるとその回数分CoUninitializeも必要ということなので、念のためにclLoadImage関数を複数回実行して、終了時に1回CoUninitializeを呼ぶテストをしてみたところ、ちゃんと終了したようです。
とはいえ、バグはバグですので、お勧めのようにOpenCVのバージョンを変更できないか検討したいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するQ&A
- 1 OpenCV1.1、OpenCV2.3の使い方
- 2 OpenCV cvLoadImageについて
- 3 opencv1.1の実行について(初心者です)
- 4 opencv 1.1から2.2への変更
- 5 OpenCVはCGIで使用できるのでしょうか
- 6 【OpenCV】ハイビジョンaviファイル読み込み途中にファイルが終了してしまう問題
- 7 タスクマネージャの「プロセスの終了」を禁止
- 8 アクセス違反でアプリケーションポップアップが出たのにプロセスが終了しない
- 9 Visual Studio 2005 Standard Edition で使用できる開発言語について
- 10 SIGALRMでプロセス終了
関連するカテゴリからQ&Aを探す
おすすめ情報
人気Q&Aランキング
-
4
セマフォとmutexの違いは?
-
5
マルチディスプレイを使用して...
-
6
VBAで別プロセスのExcelのフル...
-
7
IISがフリーズ
-
8
Linuxでのスレッド間メッセージ...
-
9
プロセスIDの取得方法
-
10
OSPFでプロセスを分ける意義に...
-
11
SendMessageが失敗するときがある
-
12
c言語でプロセスIDを調べたい
-
13
C言語のプログラムにて二つの処...
-
14
共有メモリを使う場合のCPU負荷...
-
15
CreateObjectで作成したExcelの...
-
16
Visual C++からpingを実行して...
-
17
プロセスIDからウィンドウハ...
-
18
起動中の他のプログラム(orプ...
-
19
シートのコピーでプロセスが残...
-
20
特定ユーザーのプロセス情報を...