4

いくつかの OpenCV 機能をアプリケーションに統合しようとしています。現在、カメラからビデオ フィードを取得するために DirectShow を使用してコードをセットアップしています。これは MFC ウィンドウに表示されます。このコードは変更または削除できません。

コードは完全に正常に実行されますが、場所に関係なく、次のコード行を配置します。

IplImage *img = cvLoadImage("C:/well.jpg");

ウェブカメラが正しく初期化できず、プログラムが中断します。

より直接的には、次の場所で FAILED HRESULT を取得します。

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)

より具体的には、私のコードのある時点で、CDialog::doModal() を呼び出すと、CoInitializeEx() にヒットし、プログラムが失敗します。

ここで何が起こっているのか誰にもわかりますか?

4

3 に答える 3

4

スレッドが以前に別のアパートメントとして初期化されていた場合、つまり以前に CoInitializeEx(NULL, COINIT_MULTITHREADED) があった場合、CoInitialize は失敗します。

OpenCV が CoInitializeEx(NULL, COINIT_MULTITHREADED) を呼び出すと、その後の CoInitializeEx への呼び出しが失敗すると思います。これは、CoInitializeEx の戻り値を確認することで確認できます。この場合は RPC_E_CHANGED_MODE になります。

簡単な修正方法はありません。最も簡単な方法は、OpenCV 呼び出しを別のスレッドに移動することです。

于 2009-04-10T05:30:21.553 に答える
1

マイケルが言ったことに加えて、外部に依存する DLL もチェックしてください。1 つ欠けていると、CoInitialize も失敗します。

于 2009-04-10T07:51:49.623 に答える
0

同様の問題がありました。私の MFC アプリでは、 への呼び出しが でAfxOleInit失敗しましたRPC_E_CHANGED_MODE

失敗を無視することはできず (アプリ内に COM が必要です)、OpenCV 呼び出しを別のスレッドに移動することもできません (Michael が正しく示唆しているように)。

私の問題を解決するスレッド「wxwidgets and opencv 1.1 ole initialization error」を見つけました。OpenCVからのビデオ入力サポートは必要ないので、http:#define HAVE_VIDEOINPUT 1 //tech.dir.groups.yahoo.comで提案されているように削除できます。 /グループ/OpenCV/メッセージ/60060

に移動し_highgui.h、96 行目 (" ") をコメントして、#define HAVE_VIDEOINPUT 1再コンパイルします。

OpenCV_1.1pre1a で動作します。

于 2012-07-19T08:55:20.847 に答える