

Windowsでカメラからの画像入力を使うには、Flash(Air)やProcessing、Max/MSPを除くとDirectXかVideo for Windowsを使わなければならないんだけど、これらをC#から直接使うのはとてもめんどい。
で、DirectX自体はラッパーを介して使えるので問題ないんだけど、DirectShow(カメラの入力に使う)だけはなぜかC#用のラッパーが無いのでDirectShow.NETの出番になる。このライブラリはs.h.log DirectShow.NETで静止画キャプチャでも使ったんだけど、去年ぐらいからDirectShow.NETがver 2.0になってさらに良くなっていた。
ちょっといじってみたが、C++が苦手な馬鹿には便利すぎて感動したので、
webcam撮影→JPEG画像に保存のサンプルを作って置いておきます
■作ったもの
→ Download (VisualStudio 2008 + C#3.0)
昨日の朝にDirectShow.NET2.0でwebcamキャプチャ、JPEG保存 – 橋本詳解で書いたのとほぼ同じだが、デバイスの選択ができるようになった。

あと、DirectShow.NETを使えば、インストールすると1GBぐらいになるDirectX SDKを入れなくても済むのも嬉しい。
■プログラムの準備
まず準備としてDirectShow.NETのサイトからDirectShowLib-2005.dll本体と、サンプルを手に入れる。
DirectShowLib-2005.dllにパスを通し、sampleに入っているCapture.csもpublic domainなのでコピーしてありがたく使わせていただく。
そして、いくつか使うnamespaceを通す
usingDirectShowLib;
usingSnapShot;
usingSystem.Runtime.InteropServices;
usingSystem.Drawing.Imaging;
■カメラデバイスを取得してプレビュー表示する
なんでもいいが、System.Windows.Forms.Controlを継承しているPanelやPictureBoxやFormなどを、カメラのプレビュー用に用意しなければならない。プレビューを画面に出したくなければVisible = falseしておけばいい。
そのコントロールをCaptureクラスのコンストラクタに渡してやると、cameraのプレビュー表示がリアルタイムに表示されるようになる。
PanelpanelPreview=newPanel();
this.Controls.Add(panelPreview);
Capturecam=newCapture(0,640,480,24,panelPreview);//device,x,y,24FPS,preview
Capture()の第一引数は画像入力デバイスのindexで、0からはじまる。存在しないデバイスindexを選んでしまうとエラーになるので注意。FPSやカメラのXYサイズも指定できる。
■現在のカメラ表示を保存する
別のコントロールを用意して、そっちに保存する。今回のサンプルアプリの場合は、左の動画が右に静止画としてキャプチャされる。
PictureBoxにキャプチャするなら
PictureBoxpicBox=newPictureBox();
this.Controls.Add(picBox);
IntPtrm_ip=cam.Click();
Bitmapb=newBitmap(cam.Width,cam.Height,cam.Stride,PixelFormat.Format24bppRgb,m_ip);
b.RotateFlip(RotateFlipType.RotateNoneFlipY);//上下反転しているので直す
picBox.Image=b;
Image型で静止画をコピーできたので、JpegファイルやPNGファイルなどに書き出すのも簡単。
picBox.Image.Save("captured.jpg",ImageFormat.Jpeg);
もちろんPictureBoxを経由しないで、直接保存もできる
b.Image.Save("captured.jpg",ImageFormat.Png);
カメラを閉じるのを忘れずに。
FormのFormClosedイベント内などでDispose()を呼べば良い
cam.Dispose();
ちなみに、現在接続してあるデバイスの一覧はDsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)の中に入っている。
今回のサンプルでコンボボックスの中にデバイス名一覧を突っ込んだのはこんな感じでやった
comboBoxDevices.Items.Clear();
foreach(DsDevicedsinDsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice))
{
comboBoxDevices.Items.Add(ds.Name);
}
comboBoxDevices.SelectedIndex=0;
ComboBox.SelectedIndexで現在選ばれたデバイス名のindexがわかって、それをCaptureのコンストラクタのデバイスindexとして使えば良い。
どうやら学校のcczのFTPサーバーを使いたい人がいるみたいなので書いておく
Making Things Talk POCHI: sfcのFTPサーバってなんやー
CNS Guideも最近更新されてないみたいで、FTPと検索しても情報はなんも出てこなかったけど、確かにSFCにはFTPサーバーが存在する。ただし見えない所に隠されている。
■sshトンネリング
FTPで接続するにはPuttyなどを使ってsshトンネリングでFTPへの道を通してあげないとならない。
TeraTermでもできる。
Puttyで、ccz00のFTPサーバーへの道をトンネリングする例。
まずccz00に接続してから、トンネルの設定をする
この例では、localhost(自分のPC)の8021へのアクセスを全部 ccz00.sfc.keio.ac.jp:21 に転送するようになる。
21はFTPのportですね

FFFTPの場合の例。なぜか自分に接続しにいきましょう。するとさっき設定したputtyによって学校のサーバーに転送される。

もう一つFFFTPの設定。ポート番号をさっきputtyで設定した8021にする。あとSFCの場合はPASVモードにするのを忘れずに。PASVじゃなくても良いサーバーもあるかもしれない。

Fwinkでやりたいなら、FTP SettingsのところのFTP Serverに localhost:8021 を指定すればいいんじゃないだろうか
2週間ぐらい前にchumby nightというイベントが恵比寿であり、俺もchumby持って参加した。
会場では初めてyoggyさんに会って、9V電池をくれてe-mobile+macbookでWiFiも建ててくれてお世話になりました。
chumbyの底部をあけると9V電池のコネクタがあり、「サポート対象外」みたいな事が書いてあるが普通に動く。

もらった電池。けっこう高そう。
Hacking hardware for chumby – ChumbyWikiにも電池の事が書かれていて、ER-PHOTOというデジタルフォトフレーム用の電源がそのまま使えるとのこと。入力は9〜12Vで、2000mAhのER-PHOTO用バッテリで3時間もつらしい。
9V乾電池はだいたい200mAh程度の容量なので、10分の1として計算するとだいたい18分。
たしかに会場では20分ぐらいで電池切れた。(WiFi使用、USBからwidget読み込み、音楽再生なし)

ちなみにふだんは千石電商の入って左で売ってる70円の9V電池が安いので常用してるんだけど、コイツでは新品でもchumbyは起動しなかった。chumbyにはきっかり9V以上出る電池じゃないと駄目みたいだ。
(普段は5Vに落とした回路を作ってるので、9Vきっちり出て無くても十分だった)