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

标签 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 位图对象能够执行此操作?

最佳答案

可以引用here ,虽然代码行是用C#写的,但是对你来说还是很有值(value)的

关于c++ - 如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23072476/

相关文章:

c++ - 模板的两个指针之间的差异

wpf - 如何为每个组合框设置数据上下文?

multithreading - 从线程设置 bean 属性

c++ - 为什么在宏中使用看似毫无意义的 do-while 和 if-else 语句?

c++ - 将对象从一个 std::deque 移动到另一个的更好方法?

c# - 如何将项目添加到 ObservableCollection?

wpf - 命令参数引用MVVM模式中的 View 控件是否正确?

multithreading - 在 Clojure 的多线程程序中初始化资源的正确方法是什么

c# - 使用多个线程创建对象时变慢

c++ - 将十六进制数据写入可执行文件不起作用? C++