【问题标题】:Copy OpenCV Mat 32FC1 data to a WriteableBitmap将 OpenCV Mat 32FC1 数据复制到 WriteableBitmap
【发布时间】:2014-06-10 19:57:49
【问题描述】:

非常简短的故事是,我想将 CV_32FC1 OpenCV 图像复制到格式化为 [PixelFormats.Gray32Float][2] 的 Windows [WriteableBitmap][1]

以下代码适用于所有 8 位图像格式(CV_8UF1、CV_8UF3 等)

writeableBitmap = new WriteableBitmap(imgWrapper.Width, 
                                      imgWrapper.Height, 96, 96,
                                      imgWrapper.PixelFormat, null);

var frameSize = new Int32Rect(0, 0, imgWrapper.Width, imgWrapper.Height);
writeableBitmap.WritePixels(frameSize, imgWrapper.Data, imgWrapper.Stride, 0);

imgWrapper.Data 是一个数组 byte[],所以我“盲目地”将数据复制到 WriteableBitmap。显然 WriteableBitmap 和 OpenCV 图像对于 8 位图像具有相同的布局,但对于灰色 32 位图像可能不是。

1) OpenCV如何格式化32FC1 Mat数据? 2) Visual Studio 中有没有办法将 Mat.data 视为 32 位浮点数。在调试器中,它始终显示为字节。 3)我读过关于将 32F 图像缩放到 0-1 的信息。这是通用的吗? Windows WriteableBitmap 对数据的解释是否相同?

感谢任何帮助或提示

【问题讨论】:

    标签: c# wpf opencv image-processing bitmap


    【解决方案1】:

    为了查看 CV_32FC1 Mat 中每个像素的值,我最终将其转储到 xml 文件中。

    string filename = "averageImage.xml";
    FileStorage fs(filename, FileStorage::WRITE);
    fs << "R" << averageImage32FNormalized; 
    

    要查看 VS 中的数据,可以将 Mat 数据指向一个浮点数组 浮动*数据 = (float*)(averageImage32F.data); 然后在监视窗口中输入“data,100”(例如查看前 100 个值)

    为了在 WPF 中显示,浮点值需要缩放到 0-1

    Mat averageImage32FNormalized;
    cv::normalize(averageImage32F, averageImage32FNormalized, 0, 1, NORM_MINMAX);
    

    然后您可以使用 writeableBitmap.WritePixels,如我的原始帖子所示。

    请注意,我上面显示的 cv::normalize 不会将最暗的像素归一化为 0,将最亮的像素归一化为 1。似乎假设浮点值在 0-255 范围内。换句话说,浮点值 150.3 被转换为 0.59 (150.3/255)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2018-08-16
      • 1970-01-01
      相关资源
      最近更新 更多