2011-02-07 14 views
0

FreeImage(FIBITMAP)とOpenCV形式(IplImageおよび/またはMat)間でデータを交換する必要があります。 FreeImageはFreeImage_GetScanLine関数を提供しているので、FIBITMAPからIplImageまたはMatにデータを取得するのは問題ありません。これはOPenCV imageData ptrを設定することができます。OpenCV IplImageまたはMatをFreeimageにコピーするFIBITMAP

しかし、私は逆の方法、つまりOpenCVイメージを取得したら、そのデータをFreeImageイメージにどのように取得するのですか?

答えて

0

あなたがする必要がありますちょうどデータポインタをコピーするだけで十分注意してください。多くのイメージフォーマットでは、新しい行をそれぞれ4バイト境界で開始するためのパディングがあります。

画像にGetScanLine()関数がある場合は、空のplImage */cv :: Matを作成し、GetScanLine()およびcptのcpt: :MAt

cv::Mat &src   
int srcRowBytes = width * src.elemSize(); 

for (int ih=0;ih<height;ih++) { 
    memcpy(dest.pointer_to_row(ih),src.ptr(ih),srcRowBytes); 
} 
+0

'IplImage'と' cv :: Mat'の両方に、この理由(パディング)がある行程があります。 – etarion

+0

はい、しかし、Freeebitmapがステッピングで使用しているものを見つけることができますか? –

+0

OpenCVのstepWidthと同じく画像の幅をバイト単位で返す関数FreeImage_GetPitchがあります。私はこれをすぐに試してみましょう。ありがとう。 – SSilk

0

さて、あなたはコピーを気にしないならば、あなただけのFIBITMAPためIplImage*/cv::Matヘッダを作成することができますし、このように、(OpenCVの機能を使用して)コピー:

cv::Mat src; // your source image 
FIBITMAP whatever; // allocate space for your FIBITMAP here 
cv::Mat wrapper(height, width, CV_8UC3, ptr_from_FIBITMAP, step); 
src.copyTo(wrapper); 
1

ここでは変換のためのより詳細なコードを示します。どちらのライブラリにも多くの画像データ型がありますが、私は最も一般的なものをサポートしようとしました。これは、ソースとしてcv :: Matを渡していることを前提としています。 FreeImageは左下の視点を持っています!

/* These are openCV types 
#define CV_8U 0 
#define CV_8S 1 
#define CV_16U 2 
#define CV_16S 3 
#define CV_32S 4 
#define CV_32F 5 
#define CV_64F 6 
*/ 

/* these are FI types 
FIT_UNKNOWN = 0, // unknown type 
FIT_BITMAP = 1, // standard image   : 1-, 4-, 8-, 16-, 24-, 32-bit 
FIT_UINT16 = 2, // array of unsigned short : unsigned 16-bit 
FIT_INT16 = 3, // array of short   : signed 16-bit 
FIT_UINT32 = 4, // array of unsigned long : unsigned 32-bit 
FIT_INT32 = 5, // array of long   : signed 32-bit 
FIT_FLOAT = 6, // array of float   : 32-bit IEEE floating point 
FIT_DOUBLE = 7, // array of double   : 64-bit IEEE floating point 
FIT_COMPLEX = 8, // array of FICOMPLEX  : 2 x 64-bit IEEE floating point 
FIT_RGB16 = 9, // 48-bit RGB image   : 3 x 16-bit 
FIT_RGBA16 = 10, // 64-bit RGBA image  : 4 x 16-bit 
FIT_RGBF = 11, // 96-bit RGB float image : 3 x 32-bit IEEE floating point 
FIT_RGBAF = 12 // 128-bit RGBA float image : 4 x 32-bit IEEE floating point 

*/ 

if(_dib) // get rid of the current dib. 
    FreeImage_Unload(_dib); 


int width = src.size().width; 
int height = src.size().height; 

switch(src.type()) 
{ 
case CV_8U :{_dib = FreeImage_AllocateT(FIT_BITMAP,width, height, 8) ;}break; // 8 bit grayscale 
case CV_8UC3:{_dib = FreeImage_AllocateT(FIT_BITMAP,width, height, 24);}break; // 24 bit RGB 
case CV_16U :{_dib = FreeImage_AllocateT(FIT_UINT16,width, height, 16);}break; // 16 bit grayscale 
case CV_16S :{_dib = FreeImage_AllocateT(FIT_INT16 ,width, height, 16);}break; 
case CV_32S :{_dib = FreeImage_AllocateT(FIT_INT32 ,width, height, 32);}break; 
case CV_32F :{_dib = FreeImage_AllocateT(FIT_FLOAT ,width, height, 32);}break; 
case CV_64F :{_dib = FreeImage_AllocateT(FIT_DOUBLE,width, height, 32);}break; 
default:ASSERT(FALSE); 
} 

if(_dib==NULL) 
    return FALSE; 


int srcRowBytes = width * src.elemSize(); 

for (int ih=0;ih<height;ih++) 
{ 
    BYTE* ptr2Line = FreeImage_GetScanLine(_dib,(height-1)-ih); 
    memcpy(ptr2Line,src.ptr(ih),srcRowBytes); 
} 
_bHasChanged = TRUE; 

return TRUE; 
関連する問題