2011-02-04 89 views
0

我目前使用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時是否有錯誤,或者是否有更細微的變化?謝謝。

回答

0

嗯,我從來沒有真正搞清楚這一個;長話短說,FreeImage和OpenCV在加載大多數圖像格式時都同意顏色通道順序(BGR),但在加載PFM時沒有。我只能假設FreeImage的製造商因此錯誤地解釋了PFM公認的不太固化的規格。由於我只使用FreeImage來讀/寫PFM,並且在使用OpenCV函數處理後將數據返回到FreeImage結構中非常複雜,所以我編寫了自己的PFM讀/寫代碼,結果非常簡單。