我有个折页码:
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. ... 如何解决这个问题?
发布于 2012-07-15 20:50:34
这是一个与COM相关的错误,这无疑是因为您在后台线程上创建了Capture对象。COM对象具有线程关联,一旦创建它的线程停止运行,COM对象就死了,不能再使用了。无论如何,尝试使用它都会产生警告。
这在RunWorkerCompleted事件处理程序中没有发生,这是相当值得注意的,它必须以一种不明显的方式隐藏在OpenCV或Emgu管道中。这并不意味着它不可能在某一天发生。您需要重新考虑这一点,只在工作人员上创建对象并在UI线程上运行其他所有内容都是没有意义的。对工人做每件事,包括处理。或者什么都没有。
发布于 2012-07-15 18:48:34
我想这与你的相机捕捉库以及它如何使用非托管资源有关。
首先,我将注释RunWorkerCompleted中的所有代码,以查看消息是否仍在发生。如果没有,那么它是由一个或多个GetCaptureProperty调用引起的。但我怀疑不会的。
我在文档 of Egmu.CV.Capture中看到,有一个Capture.DisposeObject()方法可以讨论释放捕获的对象。我的猜测是,在您实例化_capture并完成您需要做的事情之后,您必须进行清理。我建议在您的ProcessFrame完成后(或者在应用程序退出时),尝试调用_capture.DisposeObject(),看看它是否清理干净并优雅地退出。
编辑:
如果其他方法都失败了,我建议的方法是尽可能多地注释掉您的代码,这样您就可以在不引发异常的情况下退出程序。然后,对代码中的部分进行注释,直到您能够准确地找到创建或运行的内容,最终会在退出时导致异常。一旦您能够本地化它,您就会更好地了解如何修复它。
https://stackoverflow.com/questions/11494375
复制相似问题