趣味は車輪の再発明♪

[opencv] オプティカルフローを可視化する


詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識
Gary Bradski Adrian Kaehler
オライリージャパン
売り上げランキング: 25,746


■ たかみんつ / ソフト開発メモINDEX / OpenCVリファレンス(じぶん用) / 関数・クラスの使い方・サンプルなど /


カメラ画像のオプティカルフローを可視化するサンプルプログラムです。 ここでは、Farnebackのアルゴリズムを使用します。

※ オプティカルフローに関するルーチンは、opencv_video ライブラリに含まれています。

#include "stdafx.h"
#include <windows.h>
#include <opencv2/opencv.hpp>
#include <opencv2/superres/optical_flow.hpp>

using namespace cv;

//オプティカルフローを可視化する。
//縦横のベクトルの強さを色に変換する。
//左:赤、右:緑、上:青、下:黄色
void visualizeFarnebackFlow(
    const Mat& flow,    //オプティカルフロー CV_32FC2
    Mat& visual_flow    //可視化された画像 CV_32FC3
)
{
    visual_flow = Mat::zeros(flow.rows, flow.cols, CV_32FC3);
    int flow_ch = flow.channels();
    int vis_ch = visual_flow.channels();//3のはず
    for(int y = 0; y < flow.rows; y++) {
        float* psrc = (float*)(flow.data + flow.step * y);
        float* pdst = (float*)(visual_flow.data + visual_flow.step * y);
        for(int x = 0; x < flow.cols; x++) {
            float dx = psrc[0];
            float dy = psrc[1];
            float r = (dx < 0.0) ? abs(dx) : 0;
            float g = (dx > 0.0) ? dx : 0;
            float b = (dy < 0.0) ? abs(dy) : 0;
            r += (dy > 0.0) ? dy : 0;
            g += (dy > 0.0) ? dy : 0;

            pdst[0] = b;
            pdst[1] = g;
            pdst[2] = r;

            psrc += flow_ch;
            pdst += vis_ch;
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    VideoCapture cap(0);
    Mat capture, current, previous,flow,visual_flow;
    
    cvInitSystem(argc, argv);
    cvNamedWindow("flow", CV_WINDOW_AUTOSIZE);
    
    while(true) {
        
        //カメラキャプチャ
        cap >> capture;
        
        //グレイスケールへ変換
        cvtColor(capture, current, CV_BGR2GRAY);
        
        //前のフレームがあれば、オプティカルフローを計算し、表示する
        if(!previous.empty()) {
        
            //オプティカルフロー計算
            calcOpticalFlowFarneback(
                previous, current, flow, 
                0.5, 1, 15, 1, 5, 1.1,
                OPTFLOW_FARNEBACK_GAUSSIAN);
            
            //フローを可視化
            visualizeFarnebackFlow(flow, visual_flow);
            
            //表示
            imshow("flow", visual_flow);
        }
        
        //前のフレームを保存
        previous = current.clone();
        
        if (cvWaitKey(1) == '\x1b') {//ESC
            break;
        }
    }
    cvDestroyAllWindows();
    return 0;
}

関連文書


Pythonプロフェッショナルプログラミング 第2版
秀和システム (2015-05-21)
売り上げランキング: 1,813


クラウドではじめる機械学習 Azure MLでらくらく体験
脇森浩志 杉山雅和 羽生貴史
リックテレコム
売り上げランキング: 2,081

実践Node.js プログラミング (Programmer's SELECTION)
Mike Cantelon Marc Harter T.J. Holowaychuk Nathan Rajlich
翔泳社
売り上げランキング: 40,213

■ たかみんつ / ソフト開発メモINDEX / OpenCVリファレンス(じぶん用) / 関数・クラスの使い方・サンプルなど /



RSS Feed Widget
[opencv] オプティカルフローを可視化する
(http://bicycle.life.coocan.jp/takamints/index.php/doc/opencv/doc/opticalflow_farneback)
by Koji Takami ( email: vzg03566@gmail.com, GitHub: takamin )