2011年2月28日月曜日

GT5用のDirectXフィルターの作成(1)

グランツーリスモ5のキャプチャー画面から車速とギアを認識するDirectXフィルターをつくってました。

まだ習作レベルです。
こちら

やり方ですが、OpenCV1.0についてくるproxytransフィルターを改造してつくります。
(現在OpenCVのバージョンは2.2? バージョンアップしたほうがいいのかしらん。。。)
proxytransフィルターの組み込み方は、僕の以前のブログ(lostworksの方)に書きましたが、ちょっとしたコツが必要です。
僕は、KMPlayerに組み込んでます。

画像からの文字認識は、あらかじめ文字を切りだしておいて下のような画像を作っておき、これを使ってテンプレートマッチング(cvMatchTemplate())で特徴量を出します。


文字が赤いのは、R画像だけ使うためです。
cvMatchTemplate()にはいくつかメソッドを選択できるのですが、CV_TM_SQDIFF_NORMEDだとうまくいかなかったのでCV_TM_CCOEFF_NORMEDを使いました。

キャプチャー動画ですが、生の動画サイズは640X426なんですね><てっきり720X480だと思っていたので、テンプレート画像をもう一度つくらないといけないです><

特徴量を出した後の判定処理ですが、最初は、CvKNearest()を使ってk-近傍法で判定できるかなぁっと作ってみたんだけど、文字が存在しない場合(100, 10の桁の数字がない場合)の判定方法の対処方法がわからなかったので、現状ではcvMinMaxLoc()でテンプレートマッチングした値の最大値となる位置を割り出して判定してます。最大値が0.5以下だったらそこは路面って判定です。

かなり冗長に作ったのですが、フレームレートは1/60?1/30? PCにとっては長い処理時間間隔なので余裕で処理できますね^^
本当は、動画フレームから画像を切りだしてテンプレートマッチング以外の特徴量ベクトルをだし、判別処理にぶち込むのがよいのでしょうが、その特徴量ベクトルを出す手法としてなにが最適なのか、よくわからなかったので今後の研究対象です。

また、上のリンクの動画の最後の方、路面に文字が書いてあるところを通過するときに、認識が失敗しているのですよね><原因調査と改良が必要です。

まだまだ使えるレベルには程遠いなぁ。。。

0 件のコメント:

コメントを投稿