如何在不同的线程中将图像数据从BitmapSource(WPF)复制到C ++ :: CLI中的cv :: Mat(OpenCV)?

时间:2014-04-15 00:07:46

标签: c++ wpf multithreading opencv bitmapsource

我在UI线程中创建了BitmapSource,我想将其像素数据复制到cv::Mat以便在单独的线程上进行处理。当然,如果我用Dispatcher.Invoke调用包装复制代码,那么它就有效,但是我浪费了同步时间。

int width = bitmapSource->PixelWidth;
int height = bitmapSource->PixelHeight;
int bytesPerPixel = bitmapSource->Format.BitsPerPixel / 8;
int stride = 4 * ((width * bytesPerPixel + 3) / 4);

...

cv::Mat &inputImage = wrapper.getRawImage();  // This is a refe
if (inputImage.size().width != width || inputImage.size().height != height || inputImage.type() != newType) 
    inputImage = cv::Mat::zeros(height, width, newType);
bitmapSource->CopyPixels(Int32Rect::Empty, IntPtr(inputImage.data), height*stride, stride);

我尝试冻结bitmapSource对象,现在它一直有效,直到调用CopyPixels,但在尝试将其内容复制到inputImage数据时失败了。如果对象被冻结,为什么CopyPixels无法将其冻结缓冲区复制到另一个内存缓冲区?关于如何避免在主线程上调用调用的任何想法?是否有其他WPF位图对象能够执行此操作?

1 个答案:

答案 0 :(得分:0)

你可以参考here,虽然代码行是用C#编写的,但它对你很有价值