我目前正在使用 FreeImage 将 PFM 加载到一个使用 IplImages(OpenCV 的旧数据类型)的程序中。这是我正在做的一个示例(忽略有关 img 是 Mats 数组的部分,这与其他一些代码有关)。
FIBITMAP *src;
// Load a PFM file using freeimage
src = FreeImage_Load(FIF_PFM, "test0.pfm", 0);
Mat* img;
img = new Mat[3];
// Create a copy of the image in an OpenCV matrix (using .clone() copies the data)
img[1] = Mat(FreeImage_GetHeight(src), FreeImage_GetWidth(src), CV_32FC3, FreeImage_GetScanLine(src, 0)).clone();
// Flip the image verticall because OpenCV row ordering is reverse of FreeImage
flip(img[1], img[1], 0);
// Save a copy
imwrite("OpenCV_converted_image.jpg", img[1]);
奇怪的是,如果我使用 FreeImage 来加载 JPEG,而不是将 FIF_PFM 更改为 FIF_JPEG 并将 CV_32FC3 更改为 CV_8U,这可以正常工作,即复制的图片保持不变。这让我认为 OpenCV 和 FreeImage 普遍同意 RGB 通道的顺序,并且问题与 PFM 以及它们是非标准化格式有关。
我正在加载的 PFM 是用这段代码编写的(在“局部直方图均衡”下),它似乎以 RGB 顺序编写它们,尽管我可能错了。它只是从 MATLAB 3D 双精度矩阵中获取数据,并使用 fwrite 将其转储到文件中。此外,如果我修改该代码以编写 PPM,然后在 IrfanView 中查看它们,它们看起来是正确的。
所以,这让我认为 FreeImage 正在将文件数据作为 BGR 排序在磁盘上,它不是,也不应该是。
有什么想法吗?FreeImage 对 PFM 的读取是否存在错误,或者这里是否发生了更微妙的事情?谢谢。