【问题标题】:Converting a SoftwareBitmap or WriteableBitmap to cv::Mat in c++/cx在 c++/cx 中将 SoftwareBitmap 或 WriteableBitmap 转换为 cv::Mat
【发布时间】:2016-09-19 09:56:59
【问题描述】:

我尝试在 c++/cx Microsoft 通用应用程序中将 WriteableBitmap 转换为 cv::Mat。但是当我尝试使用创建的 Mat 进行处理时,出现以下错误:

这是我的代码:

void App1::MainPage::processImage(SoftwareBitmap^ bitmap)
{
     WriteableBitmap^ wb = ref new WriteableBitmap(bitmap->PixelWidth, bitmap->PixelHeight);
     bitmap->CopyToBuffer(wb->PixelBuffer);
     Mat img_image(wb->PixelHeight, wb->PixelWidth, CV_8UC3,(void*)wb->PixelBuffer);
     //next step results in error
     cvtColor(img_image, img_image, CV_BGR2BGRA);
     ...
}

所以我的最后一个问题: 如何将 SoftwareBitmap 或 WriteableBitmap 转换为 cv::Mat?

【问题讨论】:

    标签: c++ opencv c++-cx


    【解决方案1】:

    问题在于PixelBuffer is not a void *, it is an IBuffer^

    要获取原始数据,如果您熟悉 COM 编程,您可以使用 IBufferByteAccess interface,或者如果您希望留在 WinRT 中,您可以初始化 DataReader with an IBuffer(尽管这种技术会数据的副本)。

    【讨论】:

      【解决方案2】:

      我用DataReader解决了这个问题:

      void App1::MainPage::processImage(SoftwareBitmap^ bitmap)
      {
           WriteableBitmap^ wb = ref new WriteableBitmap(bitmap->PixelWidth, bitmap->PixelHeight);
           bitmap->CopyToBuffer(wb->PixelBuffer);
           IBuffer^ buffer = wb->PixelBuffer;
           auto reader = ::Windows::Storage::Streams::DataReader::FromBuffer(buffer);
           BYTE *extracted = new BYTE[buffer->Length];
           reader->ReadBytes(Platform::ArrayReference<BYTE>(extracted, buffer->Length));
           Mat img_image(wb->PixelHeight, wb->PixelWidth, CV_8UC4, extracted);
           cvtColor(img_image, img_image, CV_RGBA2BGRA);
           ...
      }
      

      感谢 Peter Torr 的提示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-03
        • 2013-09-02
        • 2022-06-25
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 2014-05-07
        • 2011-06-07
        相关资源
        最近更新 更多