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

Posted

技术标签:

【中文标题】如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?【英文标题】:How to copy the image data from a BitmapSource (WPF) to a cv::Mat (OpenCV) in C++/CLI in a different thread? 【发布时间】:2014-04-15 00:07:46 【问题描述】:

我在 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】:

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

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。

以上是关于如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?的主要内容,如果未能解决你的问题,请参考以下文章

在 c++/cli 中将 printf 数据写入字符串变量

如何使用 c++/cli 从 C# 流到 OpenCV Mat?

如何在目标 c 中将 PFFILE 设置为本地 UIImage

如何在xamarin android中将位图图像转换为gif?

如何在 C# 中将 HttpClient PostAsync() 与线程池一起使用?

如何在Python框架Flask中将图像文件从表单上传到数据库