非常简短的故事是我要将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是否具有相同的数据解释?
感谢您提供任何帮助或提示
答案 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)。