iPadでopencv

iPad上で動画をキャプチャしてOpenCVの処理をかけるさいのメモです。
OpenCVの動画キャプチャ関数がそのまま使えないので注意が必要です。
iOS開発やxcodeがよく分かっていないので苦労しました。

コード1式(xcode用): http://navi.cs.kumamoto-u.ac.jp/~koutaki/VideoCamera-opencv.zip


以下を参考(というかほとんど同じ)にしています:
実践! iPhoneアプリ開発 http://news.mynavi.jp/column/iphone/041/index.html


上記と差分・注意点です。

  • 公式ページよりiOS用のopencv2.frameworkをDL
  • Build phaseのLink Binary Librariesに追加
  • Build settingsでCompiler for C/C++Apple LLVM compiler 4.2
  • Apple LLVM compiler 4.2-Language
    • GNU++11 [-std=gnu++11]
    • C++ Standard Library libc++(LLVM C++ standard library with C++11 support)
  • VideoCameraViewController.mをVideoCameraViewController.mmにする(C++対応にする)


opencvのヘッダはVideoCameraPrefix.pchファイルに以下を追加します。

#ifdef __cplusplus
#import <opencv2/opencv.hpp>        // opencv
#import <Accelerate/Accelerate.h>   // lapackを使うなら
#endif

captureOutputに以下のようにopencv関数を使っています。

    //*******************************************************************
    //  OpenCV画像処理ルーチン
    
    // キャプチャ画像から画像バッファを取得
    unsigned char* img = (unsigned char*)CVPixelBufferGetBaseAddress(buffer);
    // OpenCV形式の画像に変換
    cv::Mat *cimg      = cvMatFrombufGray(img,width,height);
    //--------------------------
    // ここに画像処理部分を書く
    cv::Canny(*cimg, *cimg, 20, 20);
    //--------------------------
    //  結果出力:imgを書き換える
    for(int ptr = 0;ptr < width * height;ptr++){
        img[ptr*4]=img[ptr*4+1]=img[ptr*4+2] = cimg->data[ptr];
    }
    //*******************************************************************