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のタブと履歴見たけどどこにもない。幻覚か)
もちろん試したけど動かない。意味的にもおかしい気がする。

続く

0 件のコメント:

コメントを投稿