2011-02-04 4 views
0

現在、FreeImageを使用して、IplImages(OpenCVの古いデータタイプ)を使用するプログラムにPFMをロードしています。ここに私がやっていることのサンプルがあります(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]); 

は、私が代わりにCV_8UにFIF_JPEGとCV_32FC3にFIF_PFMを変更することにより、JPEGファイルをロードするためにFreeImageを使用する場合、これはすなわち、コピーされた画像がそのまま出てくる、正常に動作していることです。これにより、OpenCVとFreeImageはRGBチャンネルの注文に一般的に合意していると思います。問題はPFMに固有であり、標準化されていない形式です。

私がロードしているPFMはthis code(Local Histogram Equalizationの下に)で書かれていますが、これは私が間違っているかもしれませんが、RGBオーダーで書いているようです。これは、MATLABの3Dマトリックスのdouble型からデータを取り出し、fwriteを使用してファイルにダンプします。また、PPMを書くためにそのコードを修正し、IrfanViewで表示すると、それらは正しく見えます。

FreeImageはファイルデータをディスク上でBGR順に並べていますが、そうでないはずです。

どのような考えですか? FreeImageのPFMの読み込みにエラーがありますか、ここではさらに微妙なことがありますか?ありがとう。

答えて

0

まあ、私は決してこれを整理したことはありません。 FreeImageとOpenCVは、ほとんどのイメージフォーマットを読み込むときにカラーチャンネルオーダー(BGR)で合意しますが、PFMをロードするときには合っていません。私は、FreeImageのメーカーが、PFMのための確かにあまり凝固していない仕様を間違って解釈したと仮定することしかできません。私はFreeImageを使ってPFMを読み書きしていたので、OpenCV関数で処理した後にFreeImage構造にデータを戻すのはかなり複雑であることが分かりました。私は独自のPFM読み書きコードを書いていました。