将OpenCV Mat 32FC1数据复制到WriteableBitmap

时间:2014-06-10 19:57:49

标签: c# wpf opencv image-processing bitmap

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

以下代码适用于所有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是否具有相同的数据解释?

感谢您提供任何帮助或提示

1 个答案:

答案 0 :(得分:0)

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

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

要查看VS中的数据,可以将Mat数据指向float数组     float * data =(float *)(averageImage32F.data); 然后输入&#34;数据,100&#34;在观察窗口中(例如,查看前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)。