如何在单独的线程中复制和处理WriteableBitmap



在我的kinect应用程序中,我有主线程,它负责UI线程和其他线程之间的通信。我无法复制从kinect生成的WriteableBitmap,并通过EmguCV处理将此WriteableBitmap图像传递给分离的线程。我尝试了一切:克隆,CloneCurrentValue, BlockingCollection,但总有一些问题,如:

调用线程不能访问这个对象,因为一个不同的线程拥有

或者处理数据错误。这是我的应用程序中的主循环;

WritableBitmap color; WritableBitmap depth; 
while (true) {          
    kinect.updateFrames();                
    ctrlMainWindow.Dispatcher.BeginInvoke(new Action(() =>
    {
       color = kinect.video.getBitmapColor();                   
       depth = kinect.video.getBitmapDepth();
    }));
    updateDetectors(color,depth); // Other thread
 }

如果没有一个好的,最小的完整的代码示例来可靠地再现问题,即使不是不可能,也很难知道确切的问题是什么,更不用说如何修复它了。said…

您可能已经注意到,WriteableBitmap继承了DispatcherObject,并且必须只能在拥有它的调度程序线程内访问。

可以推测,对kinect.updateFrames()的调用实际上是创建对象的过程,因此一个明显的解决方案是在被调用的匿名方法中调用方法,而不是在它之前调用

如果由于某种原因,这是不可行的,另一种选择是冻结位图之前,试图在错误的线程中使用它们。例如:

kinect.updateFrames();                
color = kinect.video.getBitmapColor();
depth = kinect.video.getBitmapDepth();
color.Freeze();
depth.Freeze();
ctrlMainWindow.Dispatcher.BeginInvoke(new Action(() =>
{
    // use color and depth in other thread
}));

禁止任何,你可以直接访问位图的数据(例如CopyPixels()Lock()/BackBuffer),并使用该数据在正确的线程上创建新的位图。

如果以上都对你没有帮助,请提供一个好的代码示例,如上面提供的链接所述。

相关内容

最新更新