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

时间:2015-08-02 19:32:37

标签: c# multithreading kinect writeablebitmap

我的kinect应用程序我有主线程,它可以用于UI线程和其他线程之间的通信。我无法复制从kinect生成的WriteableBitmap,并将此WriteableBitmap图像传递给具有EmguCV处理的分离线程。我正在尝试一切:克隆,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
 }

1 个答案:

答案 0 :(得分:2)

如果没有可靠地再现问题的a good, minimal, complete code example,那么即使不是不可能知道确切问题是什么也很困难,更不用说如何修复它。那说......

正如您可能知道的那样,WriteableBitmap继承DispatcherObject,并且只能在拥有它的调度程序线程中访问。

据推测,对kinect.updateFrames()的调用是实际创建对象的,因此一个明显的解决方案是在中调用该方法调用匿名方法而不是之前。< / p>

如果由于某种原因不可行,另一种方法是在尝试在错误的线程中使用它们之前冻结位图。 E.g:

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
}));

除此之外,你可以访问位图&#39;数据直接(例如CopyPixels()Lock() / BackBuffer)并使用该数据在正确的帖子上创建新的位图。

如果以上都不是对您有用的,请提供一个很好的代码示例,如上面提供的链接中所述。