2012年7月22日日曜日

Blockを使ったNSArrayのソート

NSArrayのソートって、

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors
とかを使ってしかソートできないのかと思ったらBlocks使ってソートできるみたい。

このメソッド
- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr

使い方


// arrayにはNSDate型のオブジェクトが入っているとする
    NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [(NSDate *)obj1 earlierDate:(NSDate*)obj2] == (NSDate*)obj1;
    }];
これで日付の降順にソートされたNSArrayを取得できます。
うだうだ別メソッドに書き出さなくてすむので、便利ですね!

2012年7月20日金曜日

パノラマ合成

パノラマ合成のアルゴリズムを実装してみましたので公開します。

環境
C++, OpenCV2.4

ソースコード
https://gist.github.com/3135917

使い方
入力として、画像ファイルを入れると,panorama.pngとしてパノラマ画像が出力されます。
画像サイズとか高さとかは割と適当なので、時間を見つけて直して行きます。
ToDo

  • カラー対応
  • サイズをきっちり揃える

コンパイル方法
MacPortsでOpenCVをインストールしたと仮定した後の話
g++ panorama_stitching.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv` -lm
でコンパイルができます。多分


アルゴリズムの概説

  1. 各入力画像に対してSURFで特徴点を抽出
  2. 隣り合う画像(入力の前後)で対応点マッチング
  3. 前後の画像から、変換行列を最小二乗法で推定。
    座標系は円筒座標を仮定し、全ての写真は同じ奥行きにあると仮定
  4. 変換行列を逐次乗じながら、それぞれの画像を結果画像にマッピングして行く
注意)
入力するときは隣り合う画像を入力してください。連続する画像で対応点が取れないと破綻します。
変換行列の全体最適は行っていないので、少しずつ計算誤差が累積します。