Youtubeに3DSのARゲームズのプレイ動画が載っていました。
ARゲームズは、ARカードをテーブルなどの上において、それを3DSで撮影して遊ぶものです。
面白そうだったので、OpenCVとWebカメラを使って真似してみようと思いました。
まずはARカードを
任天堂のサポートサイトからダウンロード。6MBのPDFでした。
「カラープリンタで印刷してください」とPDFに記載されていましたが、我が家にはカラープリンタが無いのでセブンイレブンのネットプリントで印刷。ひとまずA4とA3のサイズで印刷しておきました。
ARゲームズ風のものを作るには、いろいろと必要な処理がありそうですが、
まずは撮影した画像からARカードの位置と中身を検出することからはじめます。
処理の流れ
1.テンプレートの画像(ARカード6枚分)から、SURF特徴量を計算してどこかに保存しておく
2.撮影した画像から四角形を検索。小さすぎる四角形は省いてしまう
3.検出した四角形(たいていは台形になっている)を、cvWarpPerspectiveを使用して長方形に投影する。
4.投影後のARカードの中身のSURF特徴量を計算。
5.6枚のテンプレート画像のSURF特徴量と比較して、一致するものが多いテンプレート画像を選ぶ。
6.画面右上に、テンプレート画像を表示する。
四角形を検出するところなどは、QRコード検出器とほとんど同じだったのでそれを再利用しました。
SURF特徴量の部分は、サンプルのfind_obj.cppを参考(というかほぼコピペ)にしました。
画像から四角形を検出するのは15ms程度でできるようなのですが、SURF特徴量の検出と比較の処理で60ms程度かかってしまいます。
ただ、一度ARカードを判別してしまえばあとはそのARカードの位置を追跡するだけなので、
SURF特徴量の処理は毎回行わなくてもよさそうです。10フレームごとでもよいかもしれません。
あとはcvFindExtrinsicCameraParams2とcvProjectPoints2を使って回転ベクトルと移動ベクトルを算出できれば、ほかの物体をARカード上に表示することもできる・・・かな?
ではまた。
#2011-11-26 追記
使ってない関数の削除・エラー処理追加。
ソースは
別館に置いてあります。(20111125_ar.zip)