7月 10

ここでは PCA を OpenCV の関数を用いて行うことについてのみ説明します.PCA とは何かなどについては他のサイトや書籍を参考にされて下さい.

OpenCV には PCA を行うために次の3つの関数が用意されています.

cvCalcPCA(const CvArr* data, CvArr* avg,?CvArr* eigenvalues,?CvArr* eigenvectors, int flags);

1つ目の関数(cvCalcPCA)は,ベクトル集合の主成分分析を行う関数.この関数は,観測されるデータベクトル集合を?,主成分分析によって部分空間へ投影されるベクトルを??としたときの連続写像??を求めます.

cvProjectPCA(const CvArr* data, CvArr* avg,?CvArr* eigenvalues, CvArr* project);

2つ目の関数(cvProjectPCA)は,指定された部分空間へベクトルを投影します.あらかじめ求めた連続写像??を用いて??から??を算出します.

cvBackProjectPCA(const CvArr* project, CvArr* avg,?CvArr* eigenvectors, CvArr* result);

3つ目の関数(cvBackProjectPCA)は,投影係数から元のベクトルを再構築します.部分空間??から 観測データ空間??への逆写像??を行います.

各関数への引数については次のようになっています.

data: ?入力データ(?).avg: 平均ベクトル.

eigenvalues:出力である共変動行列の固有値.

eigenvectors: 出力である共変動行列の固有ベクトル.各行が各ベクトルを意味する.

flags:操作フラグ.
?? ? ? ? ? CV_PCA_DATA_AS_ROW, CV_PCA_DATA_AS_COL,?CV_PCA_USE_AVG

project: 分解係数の行列(?).行の数はベクトルの数と等しく,
    列の数は eigenvectors の列と同じか小さくなければならない.
    列の数が少ない場合,入力ベクトルは第(列数)成分までを基底とする部分空間へ写像.

result:再構築されたベクトルの行列(?).

?

実際のサンプルプログラムを次に用意しています.cvpca.cppdata.txt を同一ディレクトリに保存してコンパイル,実行を行ってみて下さい.Gnuplot, OpenCV がインストールされている Linux, FreeBSD, OS X では普通に動くと思います. それ以外の環境の場合は,cvpca.cpp の40行目,plotData(result); をコメントアウトすればおそらく動くのではと思います.

プログラムは実行時に Gnuplot による出力の他,次の3つのファイルを作成します.

1.PCA_products_ファイル名
2.project_ファイル名
3.result_ファイル名

1.は 入力データの各次元の平均値,固有ベクトル,固有値を記録しています.
2.は入力データの投影した部分空間上での座標を記録しています.
3.は2.を元の空間へ再構築したものを記録しています.

サンプルプログラムcvpca.cpp?[4KB],?data.txt?[560KB]

?

フィードバックが欲しいので,何かコメントを残せていただけると幸いです.

参考文献:OpenCV リファレンス マニュアル(日本語訳)

  • toki

    参考になりました、ありがとうございました

  • O_o_2000

    ソースの公開ありがとうございます。
    OpenCVの動画像解析結果をリアルタイムで表示するために参考させて頂きました。
    gnuplotはwindows版、VC+2008用にplotData();内の一行を修正してコンパイル、実行できました。
    // FILE *gp=_popen(“gnuplot -geometry 640×480″,”w”);
    FILE *gp=_popen(“gnuplot” ,”w”);

  • O_o_2000

    ソースの公開ありがとうございます。
    OpenCVの動画像解析結果をリアルタイムで表示するために参考させて頂きました。
    gnuplotはwindows版、VC+2008用にplotData();内の一行を修正してコンパイル、実行できました。
    // FILE *gp=_popen(“gnuplot -geometry 640×480″,”w”);
    FILE *gp=_popen(“gnuplot” ,”w”);

  • http://app.javac.biz/ Takashi OHKUBO

    返信おそくなりました m(..)m
    -geometry 640×480 は 画面サイズを指定しています.
    Linux や Mac では問題ないと思うのですが,Windows では困るんですね.
    ご指摘ありがとうございました.

  • http://app.javac.biz/ Takashi OHKUBO

    返信おそくなりました m(..)m
    -geometry 640×480 は 画面サイズを指定しています.
    Linux や Mac では問題ないと思うのですが,Windows では困るんですね.
    ご指摘ありがとうございました.

  • http://app.javac.biz/ Takashi OHKUBO

    返信おそくなりました m(..)m
    -geometry 640×480 は 画面サイズを指定しています.
    Linux や Mac では問題ないと思うのですが,Windows では困るんですね.
    ご指摘ありがとうございました.

  • http://app.javac.biz/ Takashi OHKUBO

    返信おそくなりました m(..)m
    -geometry 640×480 は 画面サイズを指定しています.
    Linux や Mac では問題ないと思うのですが,Windows では困るんですね.
    ご指摘ありがとうございました.

preload preload preload