“Programming” カテゴリのアーカイブ

PS3Eye Camera SDK for use in your own applications!!! « Alex Popovich’s Weblogより,
PS3用のwebカメラPlayStation EyeをDirectShowでキャプチャするためのライブラリ
PS3EyeLibが公開されたようです.

AlexPさん,ありがとう.
これで先走って買ってしまったPlayStation Eyeも自作アプリで活用できます!!

ということで,早速配布されているSDKを利用し,OpenCVと組み合わせたサンプルを紹介します.
※上記サイトのサンプルを少しいじっただけですけど。。。

間違い等ありましたら,ご指摘ありましたらよろしくお願いします.
(気が向いたら)wikiの方に利用方法を書くかもしれません.

※注意 下記コードの利用は自己責任でお願いします.

C++:
  1. //----------------------------------------------------------------------
  2. // 概要       : PS3EyeLibを用いたキャプチャサンプル
  3. // ファイル名 : CapturePS3Eye.cpp
  4. // 使用ライブラリ: 
  5. //  OpenCV for MS-Windows 1.1
  6. //  http://sourceforge.net/projects/opencvlibrary/
  7. //
  8. //  PS3EyeLib
  9. //  http://alexpopovich.wordpress.com/2008/10/20/ps3eye-camera-sdk-for-use-in-your-own-applications/
  10. //
  11. // Author    : dandelion
  12. // Date      : Oct 22, 2008; 20:00
  13. //----------------------------------------------------------------------
  14.  
  15. #include <iostream>
  16. #include <cstdlib>
  17.  
  18. //ヘッダインクルード(OpenCV関連)
  19. #include "cv.h"
  20. #include "cxcore.h"
  21. #include "highgui.h"
  22.  
  23. //ヘッダインクルード(PS3EyeLib関連)
  24. #include "IPS3EyeLib.h"
  25.  
  26. //ライブラリ読み込み(OpenCV関連)
  27. #pragma comment(lib,"cv.lib")
  28. #pragma comment(lib,"cxcore.lib")
  29. #pragma comment(lib,"highgui.lib")
  30.  
  31. //ライブラリ読み込み(PS3EyeLib関連)
  32. #pragma comment(lib,"PS3EyeLib.lib")
  33.  
  34. #define CAPTURE_WIDTH  320 //キャプチャサイズ(幅)
  35. #define CAPTURE_HEIGHT 240 //キャプチャサイズ(高さ)
  36. #define FPS             30 //フレームレート
  37. #define COLOR_DEPTH     24 //depth
  38.  
  39. using namespace std;
  40.  
  41. // 利用可能フォーマット表示関数(プロトタイプ宣言)
  42. void displayAvailableFormats(void);
  43.  
  44. int main(int argc, char *argv[])
  45. {
  46.   int key = 0;
  47.  
  48.   //キャプチャ画像
  49.   IplImage *image = cvCreateImage(cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3);
  50.  
  51.   //ウィンドウ
  52.   char* window_name = "Capture using IPS3EyeLib";
  53.   cvNamedWindow(window_name, CV_WINDOW_AUTOSIZE);
  54.  
  55.   // PS3EyeLibオブジェクト生成
  56.   IPS3EyeLib *pCam = IPS3EyeLib::Create();
  57.  
  58.   // 利用可能なフォーマットの表示
  59.   displayAvailableFormats();
  60.  
  61.   // キャプチャフォーマットの設定
  62.   pCam->SetFormat(IPS3EyeLib::GetFormatIndex(CAPTURE_WIDTH,CAPTURE_HEIGHT,FPS));
  63.  
  64.   // イメージ用バッファの確保
  65.   PBYTE pBuffer=new BYTE[(CAPTURE_WIDTH*CAPTURE_HEIGHT*COLOR_DEPTH)/8];
  66.  
  67.   // キャプチャ開始
  68.   pCam->StartCapture();
  69.  
  70.   //ESCキーが押されるまでキャプチャを続ける
  71.   while(key != 0x1b)
  72.   {
  73.     if(pCam->GetFrame(pBuffer, COLOR_DEPTH, false))
  74.     {
  75.       //キャプチャ画像をimageDataにコピー
  76.       memcpy(image->imageData, pBuffer, image->imageSize);
  77.  
  78.       //画像表示
  79.       cvShowImage(window_name, image);
  80.     }
  81.  
  82.     //キー入力
  83.     key = cvWaitKey(1);
  84.   }
  85.  
  86.   // イメージ用バッファの解放
  87.   delete [] pBuffer;
  88.  
  89.   // 後処理(PS3EyeLib関連)
  90.   pCam->StopCapture();
  91.   delete pCam;
  92.  
  93.   // 後処理(OpenCV関連)
  94.   cvDestroyWindow(window_name);
  95.   cvReleaseImage(&image);
  96.  
  97.   return 0;
  98. }
  99.  
  100. // 利用可能フォーマット表示関数
  101. void displayAvailableFormats(void)
  102. {
  103.   cout <<"[Available Formats]" <<endl;
  104.   for(int i=0; i<IPS3EyeLib::GetNumFormats(); i++)
  105.   {
  106.     int width, height, rate;
  107.     char *description;
  108.  
  109.     width       = IPS3EyeLib::GetFormats()[i].width;
  110.     height      = IPS3EyeLib::GetFormats()[i].height;
  111.     rate        = IPS3EyeLib::GetFormats()[i].rate;
  112.     description = IPS3EyeLib::GetFormats()[i].formatTxt;
  113.  
  114.     cout <<description <<endl;
  115.   }
  116. }


現在,PS3EyeLibで利用できるのは以下のフォーマットのようです(※2008/10/22現在).

320x240@15fps,
320x240@30fps,
320x240@60fps,
320x240@75fps,
320x240@100fps,
320x240@125fps,
640x480@15fps,
640x480@30fps,
640x480@40fps,
640x480@50fps,
640x480@60fps,
640x480@75fps

4000円のwebカメラでこれだけできるなんて,コストパフォーマンスがスゴすぎると思います.
学生の方は研究のお供として1台あっても良いかも.

Comments コメントなし »

アクセスが少し増えてきたので,今まで自分が作ってきたしょうもないものを挙げてみるテスト.

■学部
GA(遺伝的アルゴリズム)の研究室配属だったのに,OpenCVの存在を知り楽しそうだったので
学部4年の夏から研究テーマを画像処理に変更(一応,GAも前処理に入れてたりするけど).
#高専のときに画像処理をやってたので,ゼロからのスタートでないのが唯一の救い.

当時,OpenCVの日本語サイトはほとんど存在しなかったので,英語による情報収集がメインの暗黒時代でした.

研究としてはwebカメラで普通のディスプレイをタッチパネルにしよう!!という試み.
実際にやっていることはそんなに難しくなくて,2つのカメラで指先をトラッキングして,3次元位置情報を算出し,
スクリーンに触れているかを判定して,マウスの動作に置き換えているだけです.

あと,今思うと,マルチタッチとかやってみれば良かったなーと思いますが,
自分には先見の明がなかったのでそこまではやってない。。。



ペイント操作のデモ.320x240のキャプチャ画像を解析して,
ディスプレイ座標を算出しているので精度はお世辞にも良いとは言えない。。。


ブラウザ操作のデモ.それなりに動くのでやってて楽しかったデモ.
ただ,指先検出の前処理に肌色抽出をやっているため,webページに人の顔や
肌色に似た色が出てくると誤認識してしまう(苦笑)



■修士
可動式+透過型のマルチタッチスクリーン.マルチタッチはFTIR方式で実現.
情報の獲得と作業を並列に行う際にいかに視線移動を少なくできるかという考えのもとに実装.

透明なスクリーンにプロジェクターの映像をそれなりに投影しつつ,
FTIRも実現するということに地味に苦労した記憶が。。。
#透明なスクリーンに映像を投影するってことはスクリーンの上方向に光を拡散させないといけないんだけど,
#反面,FTIRをやる場合には,スクリーンの下方向に光を拡散させる必要があるのでかなり鬼門だった.

あと,下のムービーでは音をカットしていますが,音声合成による操作ナビゲートもやってたりします.



■修士(おまけ)
うちの大学院では,学部生が研究室をプチ体験できるイベントがあったりするわけですが,
そこで,参加者の学部生が用意していた課題を予想以上にこなしてしまったので,
急遽何か作ってくれと頼まれて作ったもの.
#実験室に3時間くらい籠もって学部生に見つからないように作ってた。。。

デモは,マーカーに書かれた場所にGoogle Earthで移動するというもので,
AISTだと産総研,JAISTだと北陸先端,NAISTだと奈良先端に移動します.
#体験セミナーのテーマが画像処理だったのでマーカー検出部も一から作りました.
#ただ,画像処理よりもGoogle Earth APIをC++側で操作する方がいろいろ苦労した気がします(苦笑)





アルゴリズムはこんな感じ.

1. 2値化
2. 輪郭線抽出
3. 輪郭線の多角形近似
4. 辺の数が4となる領域をマーカー領域として残す
5. マーカー領域のコーナー位置よりマーカーの傾きを計算
6. 傾き情報を用いてアフィン変換(傾き補正)
7. テンプレートマッチングにより文字認識
8. 認識結果をGoogle Earthに渡す

学部生対象の画像処理の課題に良いレベルだと思うので,オススメです.



と,ここまで書いてて思ったのは,学生時代しょうもないものばかり作っていたんだなぁと。。。(遠い目)
ということで,今日はこの辺にしときます.

Comments コメントなし »

コンピュータビジョン・拡張現実感に関する普通じゃない勉強会の後,
masayashiくんから
>GAINERとwiiリモートを使ったアプリ紹介。今度動画あげてください!

という要望があったので,本来発表デモに含めるはずだった物理演算機能を追加してからアップします.
#物理演算エンジン使うの初めてだったので,さすがに前日数時間だけだとそこまでは無理だった。。。
といっても,Seleneの物理シミュレーション機能(内部でOpen Dynamics Engineを使っているっぽい)を
利用させてもらうだけなので,自分では大したことはしませんが.

とりあえず,その前準備として簡単な衝突デモを作成することに.
ただ,事前に定義されているプリミティブ図形の衝突データを3Dモデルに流用するのって
どうやるんだろーとSelene ドキュメントを読みながら右往左往してたので1時間くらい格闘する羽目に。。。

以下が衝突デモ動画です.
※3Dモデルは,ファイル保管庫@七葉からお借りしました.

Comments コメントなし »

Macと戯れていたら,コンピュータビジョン・拡張現実感に関する普通じゃない勉強会
近づいてきたので,そろそろ重い腰を上げてみようかと思います(苦笑)
スロースターターですみません。。。>関係者各位

さて,自分のネタですが,発表作品にGainerを使っているものがなさそうなので,
Gainerを絡めたものを出す予定.そのため,フォルダに長い間眠っていた
Gainer with C++ vol.0で自作したライブラリを引っ張り出してみる.

で,いざ使おうと思っていると,単一センサの値読み取り程度なら十分だけど,
いろいろ不備があることが判明したので,同時期に同じことをやっていた
mootoh.log - Gainer++ - GainerをC++から使うを参考に再設計することに.
#正確には上記のもののWindows移植作業+α と言った方が正しいかも。。。

Win32 APIのスレッド周りの知識が怪しいので,結構苦戦して3時間くらいかかったけど,
とりあえず動くものはできました.これでGainerをC++で簡単に扱えます!!
#他人のソースを読むと,こんな書き方ができるのかーと発見があって面白かった

ということで,ボタンを押すと「LED点灯 + ウィンドウ上への情報表示」を行うサンプルです.
相変わらずサンプルが適当だな。。。>自分

Comments コメントなし »

手始めにApple Developer Documentationにある「Cocoaセミナー 初級編」にチャレンジしてみる.
個人的にInterface Builderの操作が新鮮で楽しい(昔やったWindowsのMFCは好きになれなかったな。。。).

とりあえず,4章のHello Worldアプリケーションまでやってみました.
ただ,テキスト通りにコーディングしただけなので,文法を理解しつつ操作に慣れていかないと.


Hello Worldアプリケーション
*****************
iPhoneタッチ機能、ジェスチャ機能のプログラミング方法 - SitePenにも紹介がありますが,
Touching and Gesturing on the iPhoneという記事が興味深いです.iPhoneに関わらず,
タッチ機能を持つアプリ開発において参考になる気がする.

あと,ソニー エクスプローラサイエンス ワークショップがすごく楽しげですね.
9月23日までやっているみたいなので,機会があったら行ってみたい.

Comments コメントなし »

以前,ARToolKitのインストール周りで格闘したわけですが,
Vistaにも入れてみるか。。。ということでやってみました.
#simpleVRML問題はこの前やった解決法を忘れてて地味に30分くらい戦ってました。。。

また,前回と同様にDSVLを再ビルドして生成したDSVL.dll,DSVLd.dllを
C:\Program Files\ARToolKit\binにコピー.そして,simpleTest.exeを実行!!
するとなぜかプログラムが落ちる。。。orz
XPで試したときは落ちてなかったのになぁ(遠い目)

とりあえず,キャプチャ周りが怪しいので,ARToolKit公式サイトで配布されているDSVL-0.0.8b.zip
DSVideoLibで配布されているdsvl-0.0.8c.zipと差し替えてみるとなぜかうまく行きました.
#まだ,エラーの原因や両者の差分は時間が無くて読めてません。。。
#とりあえず,動作報告と言うことで.稀有なVistaユーザに幸あれ.


まぁ,DSVL自体が結構古いことだし,これを機会にキャプチャ周りを変更してもいいのかもしれないけど.

Comments コメントなし »

ニュースで今日からGW後半だと言っていますが,こちらのGWは今日からスタート。。。
今年のGWは4連休なので,言うほどゴールデンではない気がします(苦笑)
#といっても,あんまり休みが長いとその後の反動も大きいので微妙ですが.

**********************************

折角CPUのコアが4つあるのでIntel TBBを少しだけ勉強中.
ということで,wikiの方にIntel TBB/インストールという記事をアップしました.
間違い等ツッコミがあればお願いします.

あと,最近wikiへのアクセスが若干増えたような気がします.
特にWindows SDKCVCAMvideoInput Library関連のアクセスが多いみたいですね.

videoInput Libraryに関しては,4月に久々のバージョンアップがあったみたいですがまだ試せてません。。。
メモリ確保・解放関連のバグフィックスをしたらしいので, 以前のvideoInput Libraryを使っている人は
バージョンアップを検討した方が良いかもしれません.

Comments コメントなし »

最近,(個人的に)デザインパターンを勉強しています.

学生の時はアイディアが浮かぶと思いつくままガーっとコーディングしていたのですが,
いい加減いい歳(25)なので,先人の知恵を借りながら幅を広げたいなと.

ということで,増補改訂版Java言語で学ぶデザインパターン入門を読みながら,
C++で小さなサンプルプログラムをちょこちょこ作っています.
#Javaでも書けるけど,(低レベルなところまで書ける)C++の方が個人的に好きなので.

(デザインパターン適用ありきの設計じゃなくて適材適所で!ということを頭の片隅に置かないといけないけど)
うまく活用できれば効率よく開発ができそう.ちょっとずつでも良いので,自分のものにしたい!!

増補改訂版Java言語で学ぶデザインパターン入門

著者/訳者:結城 浩

出版社:ソフトバンククリエイティブ( 2004-06-19 )

定価:¥ 3,990

Amazon価格:¥ 3,990

大型本 ( 484 ページ )

ISBN-10 : 4797327030

ISBN-13 : 9784797327038


Comments コメントなし »

著者の方のblogエントリで知ったのですが,日本初のProcessing解説書「Built with Processing」の改訂版が出たみたいです.僕自身,初版を持ってるので多分買わないと思いますが,Processingの最新バージョンに対応してたり,追加の記事もあるらしいので,これからProcessing始めてみる人には良いと思います.

Built with Processing [改訂版]

著者/訳者:前川 峻志 田中 孝太郎

出版社:ビー・エヌ・エヌ新社( 2008-03-31 )

定価:¥ 3,570

単行本 ( 248 ページ )

ISBN-10 : 4861005582

ISBN-13 : 9784861005589




あと,Processingつながりということで,Augmented Reality Library in Processingという記事の紹介.
simpleARToolKitというProcessingライブラリらしい.blogの動画を観た感じだと思ったより軽快に動いてますね.

カメラ周りのコードが簡単に書けるProcessingでARToolKitがこれだけ軽快に動くとなると,
Processingで用意されている便利な機能やGainerとの連携なんかができたりといろいろ楽しそうです.

************
あと,今日知ったのですが,C/C++のポインタの機能--変数の場所(アドレス)という記事がえらいことになってます.簡潔に言うと,上記の記事のポインタ周りの解説・サンプルコードが間違っているという話なわけですが,C++界で著名なεπιστημηさん等が色々と突っ込みを入れている模様.

僕自身も「エイプリールフールネタか!!」と思ってましたが,素で間違っていたみたい.まぁ,そこそこC,C++がわかっている(と自負している)人は間違い探し的な意味合いで読んでみると勉強になるかも(※ポインタ苦手な人は注意!!).といいつつ,C言語習いたてのとき(高専在学時)はポインタ苦手だったので,あんまり責められないですが(苦笑)

Comments 1 コメント »

久々にARToolKit触ってみました.
まぁ,手元にまともなwebカメラはありませんが。。。
※ IRカメラ for Diffused Illumination 作成のためにバラしたので

さて,現在手元にある環境はVisual Studio 2005 pro + Windows SDK.
この環境でARToolKit-2.72.1をビルドすると,
libARvrmlの生成でこける --> simpleVRMLビルド失敗
というわけのわからない事態に陥ります(※VRMLを見捨てれば無問題).

なんか,これは学生の時に屈した気が。。。
と苦い思い出がフラッシュバックしつつ,「この1年間の成果を見せてやる!!」という
休日深夜の変なノリで,ごにょごにょやってなんとかクリアしました.リベンジ成功!!
※簡単に上手くいったような書き方ですが,2回程挫折しかけました(苦笑)
#公式の解決法ではないため,ここにはたぶん載せません.
#興味のある人はメールででも聞いてください.


さて,残るはARToolKit\binにできる実行プログラム(Debug版)を実行しようとすると,
「MSVCP71D.dll,MSVCR71D.dllがありません!」と怒られる件について.

Web上では,
・Debug版切り捨て(世知辛い。。。)
MSVCP71D.dll,MSVCR71D.dll※再配布禁止ファイルをweb上でダウンロード

等の策を講じられているみたいですが, これだと根本的に何も解決してないので,
DSVLを再ビルドしてDSVLd.dllを生成,ARToolKit\binにコピーでクリアしました.

まぁ,このビルドにもいろいろ罠があって苦労しましたが.しばらくVC++触りたくない(苦笑)
頭の体操的には結構良いレベルではないかと思うので,興味のある人は試してみると良いかも.

#ARToolKit-2.72.1, VC++ 2005 という組み合わせでビルドに成功しないという事例が
#(国内の)Web上にはほとんどないんですけど,自分だけ?
#
この問題で困っている人って潜在的に結構いそうな気がするんですが。。。

Comments 1 コメント »