2

コンピューター ビジョン ライブラリである OpenCV 1.1 を含む Visual C++ 2005 で Windows アプリケーション (CrosslinesDetection と呼ばれる) をコンパイルすると、コンパイル エラーもリンク エラーも発生しませんが、実行すると、ある時点でフリーズし、Windows次のように述べています。

"Unhandled exception at 0x7c915223 in CrosslinesDetection.exe:
0xC0000005: Access violation writing location 0x00030ffc."

このプログラムは、2 行の OpenCV コードを含む一般的な C++ Windows アプリケーションです。

IplImage *img = cvCreateImage( cvSize( 1024, 768 ), IPL_DEPTH_8U, 1 );
cvReleaseImage( &img );

奇妙な動作は、OpenCV行を含めると、プログラムが例外をスローし、OpenCV行を除外すると、プログラムが正常に動作することです。

OpenCV ライブラリを別のプロジェクトで問題なく使用しました。具体的には、GUI 用の C# プロジェクトと、バックグラウンドで DLL としてコンパイルされた C++ プロジェクトを作成しました。上記の行に対してそのようなソリューションを作成すると、実行中に問題は発生しません。

このエラーの原因は何ですか?

助けてくれてありがとう、ステファン


コメントありがとうございます。

その間、テストには最小限のプロジェクトを使用します。

私はまだ問題を完全には理解していませんが、サードパーティのライブラリ (uEye から) を含めると例外が発生することがわかりました。

プロジェクトで OpenCV と uEye ライブラリの関数を 1 つ使用すると、例外が発生します。OpenCV または uEye から単一の関数を使用すると、例外はスローされません。したがって、これらのライブラリには互換性がないように思われるか、別の問題があります。ただし、それを検出する方法がわかりません。


いいえ、現時点ではありません。最小限の例では、関数は無関係です。1 つの関数はカメラを初期化し、もう 1 つの関数は画像構造を初期化します。


しかし、おそらくエラーは他の場所にあります...

Visual Studio で C++ Windows フォーム アプリケーションを作成しました。フォームにボタンと Form1.h ファイルの対応する関数を追加しました。

private: System::Void Form1_Click(System::Object^  sender, System::EventArgs^  e) {
  OpenCamera();
  IplImage * img = cvCreateImageHeader( cvSize( 1024, 768 ), IPL_DEPTH_8U, 1);
  cvReleaseImage( &img );
  CloseCamera();
}

そして、Form1.h の先頭に headeras を追加しました。

#include "CameraControl.h"
#include "cv.h"

次に、プリコンパイル済みヘッダー オプションをオフにし、/clr:pure から /clr オプションに変更して、プロジェクトを正常にコンパイルおよびリンクする必要がありました。

しかし、その後、上記の例外がスローされるプログラムを実行します...

C++ Windows フォーム アプリケーションを誤用していて純粋な C++ コードを含めるべきではないのか、それとも OpenCV または uEye ライブラリに本当に問題があるのか​​疑問に思っています。

4

3 に答える 3

1

マネージ コードを使用せずに、ネイティブ プロジェクトで同じコードをテストすることをお勧めします。MFC または Win32 コンソール アプリケーションのいずれか。

于 2009-01-28T08:40:18.213 に答える
0

ではない

cvReleaseImage( img );

? (アンパサンドを削除) また、適切な呼び出し規約を確認する必要があります。

于 2009-01-27T22:09:30.937 に答える
0

これらの正確な行を OpenCV 1.0 と Visual Studio 2008 で実行してコンパイルしましたが、エラーは発生しませんでした。cxcore.h ヘッダーをインクルードし、これらの 2 行を実行する以外に何もしない空のプロジェクトを作成してみてください。

また、別の投稿者へ: いいえ、アンパサンドは仕様の一部です。彼はそこで正しいです。申し訳ありませんが、これをコメントとして投稿しますが、まだできません。

于 2009-01-27T22:25:05.180 に答える