0

私は以下のコードを持っています:

public static Emgu.CV.Capture _capture;
public static DispatcherTimer _timer;
_timer = new DispatcherTimer();
_timer.Interval = _settings.camera_interval;
_timer.Tick += ProcessFrame;
BacgroundWorker _bw = new BackgroundWorker
{
    WorkerReportsProgress = true,
    WorkerSupportsCancellation = true
};

_bw.DoWork += (s, e) =>
{
    // Initialize the device in background
    _capture = new Capture();
};

_bw.RunWorkerCompleted += (s, e) =>
{
    _capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT,
        _settings.camera_height);
    _capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_WIDTH,
        _settings.camera_width);
    Brightness = _capture
        .GetCaptureProperty(CAP_PROP.CV_CAP_PROP_BRIGHTNESS);

    Contrast = _capture
        .GetCaptureProperty(CAP_PROP.CV_CAP_PROP_CONTRAST);

    // Get images from camera
    _timer.Start();
};

_bw.RunWorkerAsync();
 public override void CleanUp()
 {
     _timer.Stop();            
     _bw.Dispose();
     if (_capture != null) _capture.Dispose();
 }

アプリは正常に動作しますが、アプリを閉じるとスローされます:Message: Context0x23754b0' Disconnected. ... この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2

これはCOM関連のエラーです。バックグラウンドスレッドでCaptureオブジェクトを作成するため、間違いなく発生します。COMオブジェクトにはスレッドアフィニティがあり、それを作成するスレッドが実行を停止すると、COMオブジェクトは停止し、使用できなくなります。とにかくそれを使おうとすると警告が出ます。

これがRunWorkerCompletedイベントハンドラーで発生しないことは非常に注目に値します。これは、OpenCVまたはEmguの配管内に自明ではない方法で埋める必要があります。それは確かにそれがいつか起こることができなかったという意味ではありません。これを再考する必要があります。ワーカーでオブジェクトを作成し、他のすべてをUIスレッドで実行するだけではあまり意味がありません。処分を含め、労働者にすべてを行います。またはそれのどれも。

于 2012-07-15T20:50:34.357 に答える
1

これは、カメラ キャプチャ ライブラリと、管理されていないリソースを潜在的に使用する方法に関係があると思います。

RunWorkerCompletedメッセージがまだ発生するかどうかを確認するために、すべてのコードをコメントアウトすることから始めます。そうでない場合は、1 つ以上のGetCaptureProperty呼び出しが原因です。でもそうはならないと思います。

Egmu.CV.CaptureのドキュメントCapture.DisposeObject()に、キャプチャされたオブジェクトの解放について説明するメソッドがあることがわかります。私の推測では、インスタンス化_captureして必要なことを行った後、クリーンアップを行う必要があります。終了後ProcessFrame(またはアプリケーションの終了時) に呼び出し_capture.DisposeObject()て、クリーンアップして正常に終了するかどうかを確認することをお勧めします。

編集:

他のすべてが失敗した場合、私が提案するアプローチは、可能な限りコードをコメントアウトして、例外をスローせずにプログラムを終了できるようにすることです。次に、最終的に終了時に例外を引き起こす作成または実行されるものを正確に特定できるまで、コードの一部にコメントを付けます。それをローカライズできれば、それを修正する方法をよりよく理解できます。

于 2012-07-15T18:48:34.290 に答える