Magick++経由でインターネット上の画像やGIF画像等をOpenCVに読み込む
OpenCVは Windows 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