IplImageを作成する

OpenCVがXcode上、iPhoneシミュレータで動くようになったのでいろいろと試していこう。
OpenCV上で画像データを格納するための型は現時点(ver2.4.2)で大きく二つある。

  • IplImage構造体

 OpenCV開始当初から用意されているCの構造体。殆どの画像操作関数はこの構造体を受取る。

  • cv::Matクラス

 OpenCV2.0以降追加されたC++のクラス。IplImageと相互変換ができるようになっている。cvは名前空間

書籍やネット上の情報を見ているとIplImageとcv::Matの情報が混在しており、どちらを使ってよいか分からない。C++コンストラクタ/デストラクタに対応したcv::Matクラスがお勧めらしいのだが、呼び出すのはObjective-Cからであり、そうなのではあればC++よりもCの方がいいかなぁと。
あと、IplImageは先達の方々に充分に使い込まれお手本が多いのも魅力だ。

なので私はC++に拘らず、まずはIplImageを使うことを覚えてその上でcv::MatクラスではないとできないことがあればIplImageから変換して使うというスタンスで行こうと思う。

IplImageを生成する

IplImageは構造体なので自体は作るのは簡単だがイメージを作るために最低限必要な情報(画像の大きさ、1pxのビット深度、レイヤ数)を与える関数が用意されているのでそれを使う。

    //IplImageを生成
    IplImage* iplimage = cvCreateImage(cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4 );

    //不要になったら必ずリリース
    cvReleaseImage(&iplimage);

    //IplImageを画像ファイルから生成
    iplimage = cvLoadImage("icebraker.png", CV_LOAD_IMAGE_ANYCOLOR);

    //不要になったら必ずリリース
    cvReleaseImage(&iplimage);

C++のようにデストラクタもないしARCも効かないので使い終わったIplImageは必ずリリースする必要がある。

IplImageをUIImageに変換して表示した結果


iOSの世界で画像を表示するのにはUIKit(UIImage)を使うのが一般的だがIplImageはOpenCVの型でありiOSのUIKitでは直接扱えない。なのでIplImageをUIKitの世界に持ち込むには相互変換が必要だ。この辺は次回にでも。