2010年7月5日月曜日

【C++/CLI】OpenCVでのBitmapとIplImageへの相互変換

OpenCVを利用する際には、画像を扱う構造体がIplImageなわけだが、C++/CLIで利用する際の扱い方のメモ。基本的に、C++/CLIでは Bitmapクラスなわけなので、両者の変換をどうするか?ということになるが、
  •  IplImageへの変換は、IplImageのimageDataのメンバ変数に画像のアドレスを渡す
  • Bitmapへの変換は、 、IplImageのimageDataが指しているアドレスを渡す

というのが基本になります。下記は例ですが、通常のC++/MFC or Win32でのやり方とそんなに違いはないということがわかります。
Bitmap -> IplImageへの変換
private: IplImage* GetIplImage(Bitmap^ bitmap)
    {
     //IplImage *img = 0;
     Drawing::Imaging::BitmapData^ bd;

     IplImage *img = cvCreateImage(cvSize(bitmap->Width, bitmap->Height), IPL_DEPTH_8U, 3);

     bd = bitmap->LockBits(
      Drawing::Rectangle(0, 0, bitmap->Width, bitmap->Height),
      Drawing::Imaging::ImageLockMode::ReadOnly,
      Drawing::Imaging::PixelFormat::Format24bppRgb
      );

     memcpy(img->imageData, bd->Scan0.ToPointer(), img->imageSize);

     bitmap->UnlockBits(bd);
     return img;
    }


IplImage -> Bitmapへの変換
private: Bitmap^ GetBitmap(IplImage* src_img){
    
     Bitmap^ bmp = gcnew Bitmap(src_img->width, src_img->height, src_img->widthStep,
      System::Drawing::Imaging::PixelFormat::Format24bppRgb, IntPtr(src_img->imageData));
     return bmp;     
    }



0 件のコメント:

コメントを投稿