2012年6月16日土曜日

OpenCVでオプティカルフローを計算してみる(まだ途中)

前回の続き

間違えてたっぽい箇所:
velx, velyのcvCreateMatの第一、第二引数が逆(かも)

cvCalcOpticalFlowBMの第一、第二引数はprevImg.getCvImage()みたいに取得すべき(多分)

でも動かない。

で、oF + openCVのコード検索してると
こことか
こことかにいっぱいお名前が出てくる
Takashi Maekawaさんの
を調べてみた。

落とすとcvOpFlowBMExampleというディレクトリが入ってる。
src見るとmain.cpp testApp.cpp testApp.hが入ってて
今までみたoFの作法と一緒でそのままビルドできそう。
できなかった。
testApp.hの中でofCvColorImageとかofCvGrayscaleImageとかの名前のヘッダー読み込んだり同名の型でメンバー宣言してるけど
oFについてきたアドオン、ofxOpenCvが定義してるのは
ofxCvColorImageとかofxCvGrayscaleImageしかない。

アドオン側の名前が変わったのだと信じて、Maekawaさん側のコードにxを足していくと、とりあえずビルドはできた。
が、cvCalcOpticalFlowBMの呼び出しでcv::Exception出て止まるなあ…

http://edotprintstacktrace.blogspot.jp/2009/10/cvcalcopticalflowbm.html
を試してもダメ。

ぎゃー前進してない!

とりあえず、探した限りでは「そのまま動くoF+openCVでのサンプル」は無かった。
動作するコードが無いことには話にならないので、次はoFから一旦離れてopenCVだけのサンプルコードを探してみる。もちろん動くやつ。

メモ
http://opencv.jp/sample/optical_flow.html
http://www40.atwiki.jp/chugoku/pages/114.html

続く

2012年6月11日月曜日

OpenCVでオプティカルフローを計算してみる(途中)

openFrameworks2回目。

まだあまり良くわかってない。

とりあえず普段あまりやらないことやってみたいので、OpenCV経由でオプティカルフローを計算してみる。

1. "OpenCV openFrameworks オプティカルフロー"とかで検索

2. 以下のページが引っかかる。
http://opencv.jp/sample/optical_flow.html

3. ブロックマッチングによるオプティカルフローの計算、これy
でも多分これoF関係なくてOpenCV直だな、と思う。

4. ダメ元でcvCalcOpticalFlowBMって打ってみる。
コードヒント動くので、そのままの名前で使えるっぽい。
じゃああとは引数を適切に渡してみる。

こうなった。


#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup() {
    #ifdef _USE_LIVE_VIDEO
        vidGrabber.setVerbose(true);
        vidGrabber.initGrabber(640, 360);
    #else
        vidPlayer.loadMovie("sushi.mp4");
        vidPlayer.play();
    #endif
    
    blockSize = cvSize(10, 10);
    shiftSize = cvSize(1, 1);
    maxRange = cvSize(50, 50);
    
    velx = cvCreateMat(64, 36, CV_32FC1);
    vely = cvCreateMat(64, 36, CV_32FC1);
    
    currImg.allocate(640, 360);
    prevImg.allocate(640, 360);
}

//--------------------------------------------------------------
void testApp::update() {
    ofBackground(100, 100, 100);
    
    bool bNewFrame = false;
    
    #ifdef _USE_LIVE_VIDEO
        vidGrabber.grabFrame();
        bNewFrame = vidGrabber.isFrameNew();
    #else
        vidPlayer.idleMovie();
        bNewFrame = vidPlayer.isFrameNew();
    #endif
    
    if (bNewFrame) {
        prevImg = currImg;
        
        #ifdef _USE_LIVE_VIDEO
            currImg.setFromPixels(vidGrabber.getPixels(), 640, 360);
        #else
            currImg.setFromPixels(vidPlayer.getPixels(), 640, 360);
        #endif
        
        cvCalcOpticalFlowBM(&prevImg, &currImg, blockSize, shiftSize, maxRange, 0, velx, vely);
    }
}

//--------------------------------------------------------------
void testApp::draw() {
    ofSetHexColor(0xFFFFFF);
    currImg.draw(20, 20);
    prevImg.draw(20, 380);
}


で、実行するとcvCalcOpticalFlowBMで例外出る。

prevImg、currImgは多分合ってる。
元のコードではIplImage *だったけど、ここによると特に変換いらないよとのこと。

blockSize、shiftSize、maxRangeは元のコードと一緒で10, 10と1, 1と50, 50を指定している。意味的にも問題なさそう。

velx, velyはちょっと自信ない。画像のサイズはいま640, 360なので64, 36の行列で初期化しているけど、縦横blockSizeで割るんじゃなくてshiftSizeで割ると動くよという説もあった(いまChromeのタブと履歴見たけどどこにもない。幻覚か)
もちろん試したけど動かない。意味的にもおかしい気がする。

続く

2012年6月7日木曜日

いまさらoF触ってみた

Twitterを1ヶ月以上放置してしまった。
ブログについても、いっぺん離れると戻るのが大変なので
内容はともかく書き続けるというのをやってみようと思いますー

で、突然だけどoF始めてみた。

始めてみた?今までやってなかったの?
やだ吉川さん意外〜。

はいそうです。
まだの人、一緒にやりましょう。