Hatena::ブログ(Diary)

まちみのな@はてな

2010-07-19

Silverlight 4 で Webカメラキャプチャ & JPEG としてローカル保存

Silverlight 4 では、DirectShow でやろうとするとそれなりに面倒な、Webカメラが対応している解像度、フレームレートの一覧が VideoCaptureDevice.SupportedFormats であっさり取れてしまいます。.NET Framework 本家にも実装してほしいですね。

f:id:ksasao:20100719233516p:image

Silverlight 4 の標準ライブラリでは、JPEG 画像が生成できないので、Silverlight 界隈では、ほぼデファクトスタンダードとなっている FJCoreJPEG 画像を生成しています。

利用方法は以下のような感じ。

// 保存ボタンが押されたら、保存ダイアログを開き、
// WriteableBitmap を Jpeg に変換して保存
private void buttonSave_Click(object sender, RoutedEventArgs e)
{
    bool? dialogResult = this.saveDialog.ShowDialog();

    if (dialogResult == true)
    {
        // WriteableBitmap を JPEGに変換して保存
        byte[] fileBytes = CreateImageAsJpeg(_bmp, 80);

        // ユーザーのボタン操作によってファイル保存処理を
        // 行わないとセキュリティ例外
        using (Stream fs = (Stream)this.saveDialog.OpenFile())
        {
            // ユーザーが指定したファイル名で保存
            fs.Write(fileBytes, 0, fileBytes.Length);
            fs.Close();
        }
    }
}

CreateImageAsJpeg の中身はこのような感じ。http://blogs.msdn.com/b/davrous/archive/2009/12/18/silverlight-4-tutorial-adding-avatar-support-to-the-wcf-ria-services-business-template.aspx のコードを若干修正。

/// <summary>
/// ビットマップをJpegのバイト列へ変換します
/// </summary>
/// <param name="bitmap">変換元画像</param>
/// <param name="quality">圧縮品質(0:最高圧縮率〜100:最高品質)</param>
/// <returns>Jpegエンコードされたバイト列</returns>
private byte[] CreateImageAsJpeg(WriteableBitmap bitmap, int quality)
{
    int width = bitmap.PixelWidth;
    int height = bitmap.PixelHeight;
    int bands = 3;
    byte[][,] raster = new byte[bands][,];

    for (int i = 0; i < bands; i++)
    {
        raster[i] = new byte[width, height];
    }

    for (int row = 0; row < height; row++)
    {
        for (int column = 0; column < width; column++)
        {
            int pixel = bitmap.Pixels[width * row + column];
            raster[0][column, row] = (byte)(pixel >> 16);
            raster[1][column, row] = (byte)(pixel >> 8);
            raster[2][column, row] = (byte)pixel;
        }
    }

    ColorModel model = new ColorModel { colorspace = ColorSpace.RGB };
    FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);

    // JPEG形式でエンコード
    MemoryStream stream = new MemoryStream();
    FluxJpeg.Core.Encoder.JpegEncoder encoder
        = new FluxJpeg.Core.Encoder.JpegEncoder(img, quality, stream);
    encoder.Encode();

    // MemoryStream の先頭に移動
    stream.Seek(0, SeekOrigin.Begin);

    // MemoryStream の内容を配列にコピー
    byte[] binaryData = new Byte[stream.Length];
    long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);
    return binaryData;
}

画像の生成そのものは、クライアントPC上のみで行っているので、サーバ側は静的なファイルを置くだけでOKです。

ただ、セキュリティの理由で、保存用ダイアログに、デフォルトの保存ファイル名を指定できないようです。

2010-05-16

C# と .NET Micro Framework ではじめるマイコンプログラミング

マイコン程度のスペックで動作する、.NET Micro Framework というエディションがあります。これを利用することで、マイコンプログラミングC# で行えるようになります。

.NET Micro Framework が動作する Arduino とピン互換なボード FEZ Domino が日本でも入手できるようになったので、早速試してみました。このボードは、microSD カードの読み書きや USB ホストにも対応しています。

D

USBケーブルが刺さっていますが、これは電源用であり、別途電源を用意すればスタンドアロンで動作します。もちろん、USBケーブルをつないだ状態であれば、ブレークポイントを設定しながら実機上でデバッグすることも可能です。

上記の動画のアプリのために記述したソースコードはこれだけ。.NET Micro Framework の標準ライブラリのみで記述してみました。

f:id:ksasao:20100516145351p:image

.NET Micro Framework は、初期設定さえしてしまえば、通常の Visual Studio での .NETアプリ開発とほとんど変わらない感覚で扱うことができます。Visual Studio ではおなじみのコード補完機能 IntelliSense なども、もちろん有効ですので、キーを打った回数は全体の文字数の1/3くらいかと思います。

以下に、簡単ですが導入までの手順をまとめてみました。動作は、Windows 7 (x64) 上で確認しています。

デバイスの入手から開発環境の構築まで

1. デバイスの入手

今回は http://tinyclr.jp/products/fez-domino.htm から購入しました。


2. Visual C# 2008 Express SP1 の入手

現時点の .NET Micro Framework は Visual Studio 2010 には対応していないようなので、

http://www.microsoft.com/express/downloads/#2008-Visual-CS

で、Visual Studio 2008 Express タブ -> Visual C# 2008 Express Edition を選択し、Japanese を選択してダウンロードインストールします。

f:id:ksasao:20100516144948p:image


3. .NET Micro Framework 4.0 SDK の入手

http://www.microsoft.com/downloads/details.aspx?FamilyId=77dbfc46-14a1-4dcf-a809-eda7ccfe376b&displaylang=en

からダウンロードインストールします。


4. FEZ Domino SDK の入手

http://www.tinyclr.com/dl/

f:id:ksasao:20100516144947p:image


から Software Development Kit (SDK) を入手し、インストールします。


5. デバイスドライバインストール

デバイスマネージャーから手動でドライバインストールします。

f:id:ksasao:20100516144946p:image

ドライバのファイルは以下にあります。

(x86の場合)

C:\Program Files\GHI Electronics\GHI NETMF v4.0 SDK\USB Drivers\

(x64の場合)

C:\Program Files (x86)\GHI Electronics\GHI NETMF v4.0 SDK\USB Drivers\

インストールが完了すると、下図のように表示されます。

f:id:ksasao:20100516144945p:image


6. 動作確認

ボードと通信ができているかどうかを確認するためのツールとして、MFDeploy.exe が用意されています。MFDeploy.exe は以下の場所にインストールされています。

(x86の場合)

C:\Program Files\Microsoft .NET Micro Framework\v4.0\Tools

(x64の場合)

C:\Program Files (x86)\Microsoft .NET Micro Framework\v4.0\Tools

f:id:ksasao:20100516144944p:image

起動すると、以下のような画面が表示されます。

f:id:ksasao:20100516144943p:image

Device で USB を選択し、 Ping ボタンをクリックすると、ボードが正常であれば、

Pinging... TinyCLR

といった応答が返ります。異常がある場合には、Error が返ります。

以上で開発環境の設定は終了です。


開発手順

1. プロジェクトの作成

Visual C# 2008 Express を起動し、[ファイル(F)] -> [新しいプロジェクト(P)] を選択すると、以下の画面が表示されます。ここで、Console Application を選択します。

f:id:ksasao:20100516151357p:image


2. プロジェクトの設定

[プロジェクト(P)] -> [.. のプロパティ] を選択し、.NET Micro Framework タブを選択します。ここで、Deployment の項目を図のように設定します。

f:id:ksasao:20100516151839p:image

これで F5 キーを押すと記述したプログラムが実機上で動作するようになります。


まとめ

いやはや、便利な時代になりましたね。以下、参考サイトです。

2009-10-27

ソインスウブンカイカメラを作ってみた

目の前に書かれた数字を素因数分解したいあなたに朗報です。

このアプリを実行すると、目の前の数字が素因数分解されるようになります。

ダウンロードはこちらから(ソースコードつき)

v1.2 MTM04版 http://tinyurl.com/y9fzox9

v1.1 初回リリース版 http://tinyurl.com/ykmj7cj

なお、実行するためには、

が必要です。動かない場合には、readme.txt を参照して下さい。

f:id:ksasao:20091027004507j:image

やりましたね!!!

  • きっかけ

tokoyaソインスウブンカイカメラ。写る数字をなんでも瞬時に素因数分解する。RSA暗号の安全性が脅かされるため。即座に発売禁止。link

2009-06-23

CV・ARに関する普通じゃない勉強会2.0に参加してきました

前回に引き続き、CV・ARに関する普通じゃない勉強会2.0 にいってきました。今回は、ARの次は?というお題目ということで、たくさんのぶっ飛んだ発表がありました。また、質疑応答も、ぶっ飛んだ内容をしっかりフォローするやりとりとなっていて、とても楽しい時間を過ごさせていただきました。

さて、今回は、「多数のセンサ、クリエーターと技術者を結ぶオープンソースプロジェクトKAKEHASHI」という題目でしゃべらせていただきました。またもやスライドをさらしておきますね。

詳細については、もう少々おまちくださいませ。

関連リンク

KAKEHASHI

昨年夏に開催した電脳スターラリーに関するエントリ

前回のCVAR勉強会についてのエントリ