我目前使用FreeImage將PFM加載到程序中,否則會使用IplImages(OpenCV的舊數據類型)。下面是我正在做的一個示例(忽略有關img是Mats數組的部分,這與其他一些代碼有關)。FreeImage便攜式浮動地圖(PFM)RGB通道順序
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通過而不是改變FIF_PFM到FIF_JPEG和CV_32FC3到CV_8U加載JPEG文件,這工作正常,即複製的圖片出來不變。這讓我認爲OpenCV和FreeImage通常都會對RGB通道的排序達成一致,並且問題與PFM具體有關,並且它們是非標準格式。
我正在加載的PFM是用this code(在「局部直方圖均衡」下)編寫的,它似乎以RGB順序編寫,儘管我可能是錯誤的。它只需要一個來自MATLAB雙3D矩陣的數據並使用fwrite將其轉儲到一個文件中。另外,如果我修改該代碼來編寫PPM,然後在IrfanView中查看它們,它們看起來是正確的。
因此,這讓我想到FreeImage正在將文件數據作爲BGR在磁盤上已經訂購的,而不應該是。
有什麼想法? FreeImage讀取PFM時是否有錯誤,或者是否有更細微的變化?謝謝。