Magick++経由でインターネット上の画像やGIF画像等をOpenCVに読み込む

OpenCVWindows bitmap, JPEG, PNG等のフォーマットの画像を読み込むことができるが、割と一般的なフォーマットであるGIF画像を直接読み込むことができない。
また、インターネット上の画像ファイルを直接読み込むこともできない。
ので、今回は様々なフォーマットに対応しているImageMagickの、C++APIであるMagick++経由でインターネット上の画像やGIF画像等をOpenCVのIplImageに突っ込むことを考える。
ImageMagickやMagick++のインストールは各自の環境に応じてググってもらうとして、以下のページを参考に、Magick::Imageに読み込んでメモリをIplImageに渡せば、別フォーマットやローカルのファイルに保存することなく読み込めた。
Magick::Image Class - ImageMagick
ImageMagick • View topic - ImageMagick + Opencv

////////////////////////////////////////////////////////////////////
// ReadfromMagick++.cpp by @Luigitefu
// Magick++経由でインターネット上の画像やGIF画像等をOpenCVに読み込む
////////////////////////////////////////////////////////////////////
#include <string>
#include <cv.h>
#include <highgui.h>
#include <Magick++.h>

using namespace std; 
using namespace Magick; 

//Magick++で読み込んでIplImageを返す
IplImage* myReadImage(const string str){
  Image *magicImage= new Image(str); 
  int width= magicImage->size().width();
  int height = magicImage->size().height();
  IplImage* cvImage = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U, 4);

  //Iplimageのメモリに書き出し
  magicImage->write(0,0, width, height, "BGRA", MagickCore::CharPixel, cvImage->imageData);

  delete magicImage;
  return cvImage;
}
//てすと
int main(int argc, char* argv[]){
  IplImage *img =  myReadImage("http://www.st-hatena.com/users/Lu/Luigitefu/profile.gif" ); //Magick++経由で読み込み
    //OpenCVで何か処理
  cvSaveImage("out.png",img);
  cvReleaseImage(&img);
  return 0;
}

ちなみに、以下のページによると、ImageMagickはインターネット上のファイルは一旦一時ファイルに保存してるようなので、OpenCVで直接読めるファイルなら、Magick++経由せず、他の手段でローカルにDLして開いても速度等は変わらんかも?

ちなみに strace で追ってみたところ、/tmp/magick-xxxxxxxx と言う一時ファイルを作り、自分で inet socket を開いてファイルを取得しているらしい。

今日のトリビア - ImageMagick は http を話せる - World Wide Walker