astel-labs.net

C#などのプログラミングTipsや雑記をつらつらと書くかもしれないブログです。

  • Home
RSS

複数カメラを利用したリアルタイム画像処理 Part2

Posted on 2010年9月28日 by Nymphaea
No CommentsLeave a comment

前回の続きで、今回は2台の web カメラを利用した同時画像の読み取りを行います

今回利用した web カメラは、サンワサプライの CMS-V27SET を利用しています
(接写目的の web カメラって意外と見つからなかったのです)
次回掲載予定のディストーション補正では、このカメラを利用した場合の設定ファイルを利用します
(このカメラでなくとも、補正した感じはわかると思います)

 

web カメラを扱う方法としては、DirectX の Direct Show を利用した方法が真っ先に思いつくのですが、Direct Show は DirectX から Platform SDK (現在では Windows SDK)に移管されて以降、ほぼ目立った更新もなく現在では VC からでも若干扱いにくいままです

とはいえ、Direct Show 以外で web カメラを扱う方法は限られてしまう上に、フレームレベルでの操作を行えるものとなると、情報もほとんどないのが現状です

 

というわけで、Direct Show を使って web カメラを操作するしか道はなさそうなので、これを C# で扱う方法を考えます

ここでも C# からネイティブ DLL を呼ぶのはいろいろ面倒なので、ラッパーライブラリを探すと、Code Project に DirectShow.NET なるものが見つかります
(更新そのものは 2002 年で止まっているようです)
しかも、ライセンスは「パブリックドメイン」で公開されていますので、頒布の際にもライセンスを気にする必要がありません
※ソースをダウンロードする際には Code Project にユーザー登録をする必要がありますので注意してください

 

これで C# から web カメラを扱う方法が整ったので、実際にカメラを接続して画像を読み取ってみましょう

 

DirectShow.NET のソースをダウンロードした場合には、まずはコードをビルドしましょう
UCOMIMoniker 関連で警告が表示されると思いますが、利用する分には問題ありません

 

ここからはプロジェクトの作成を行います

○Visual Studio を立ち上げて、.net のバージョンを 2.0 以降を選択してプロジェクトを作成します
(DirectShow.NET は .net Framework 1.0 で作成されている)

○DirectShow.NET をビルドして作成した DShowNET.dll を参照設定の「参照の追加」からプロジェクトに追加します

○あとは DirectShow.NET に添付されている CaptureNET サンプルを参考にコードを書いていけば、 web カメラから画像を得ることはできます
ここからさらに、1フレーム毎に画像を取得するには多少のコードの変更が必要です

 

各変更箇所の Diff を載せると長くなるので、詳細はサンプルソースを参照してください
尚、添付するサンプルソースはわたしが試行錯誤している中でパネルコントロールを使った CaptureNET のサンプルから、1フレーム毎にキャプチャした画像をピクチャーボックスコントロールに貼り付ける過程で作成した「途中のコード」です
(一応、多少のコメントは記載しましたが)

そのため、明らかに不要なコードや冗長なコードが散在していますが、ここからリファクタリングすると現在わたしが利用しているコードではパフォーマンスに2倍程度の差がでます
(PC の処理能力を超える数の web カメラを接続すると、PC が落ちることがあるので注意しましょう)

添付するコードを利用したソフトウェアを作成する場合には、パフォーマンス以外にもエラー処理には十分に考慮したうえで 再設計 してください

あと、動作画面を張ろうかと思ったのですが、机のまわりでいい被写体がなかったのでとりあえずはプレビューなしの方向で・・・

 

これでカメラから画像を取得して、1フレーム毎に OpenCV を利用して画像処理を行う準備が整ったので、次回はディストーションの補正処理と、オマケで顔認識を実装してみたいと思います

 

 

バイナリ
・CamSample01.zip <VisualStudio2010 / .net Framework 2.0>

 

 

余談ですが、OpenCV だとより簡単に web カメラからキャプチャする方法があります

コールバック方式ではないですが、CPU 利用率を低く抑えるにはこちらのほうが良い場合がありますので、目的によって使い分けてください
わたしはフィルタグラフを使っているので Direct Show を使いましたが、スルーでデータを取るだけならこっちのほうがいいかも

using (CvCapture cap = CvCapture.FromCamera(0)) // device type + camera index
using (CvWindow w = new CvWindow("SampleCapture"))
{
    while (CvWindow.WaitKey(10) < 0)
    {
        using( var image = cap.QueryFrame()){
            image.PutText( "text",
                new CvPoint( 10, 10 ),
                new CvFont( FontFace.HersheyPlain, 1.0f, 1.0f ), new CvScalar() );
            w.Image = image;
        }
    }
}

上記コードは opencvsharp のサンプルコードにテキストを描画しただけのものです

 

Categories: C#, OpenCV, プログラミング

 

複数カメラを利用したリアルタイム画像処理 Part3
複数カメラを利用したリアルタイム画像処理 Part1

コメントを残す

コメントを投稿するにはログインしてください。

  • 2010年9月
    日 月 火 水 木 金 土
     1234
    567891011
    12131415161718
    19202122232425
    2627282930  
    « 8月   10月 »
  • 最近の投稿

    • raspberry pi に nginx をセットアップする
    • VSCode を日本語化する
    • raspberry pi に VSCode をインストールする
    • WindowsのプロダクトIDを取得する
    • SQL Server – money型とdecimal型を併用した金額計算
  • アーカイブ

    • 2020年3月
    • 2016年12月
    • 2014年6月
    • 2014年5月
    • 2013年7月
    • 2012年11月
    • 2012年7月
    • 2012年5月
    • 2012年4月
    • 2011年4月
    • 2011年1月
    • 2010年11月
    • 2010年10月
    • 2010年9月
    • 2010年8月
    • 2010年7月
    • 2010年6月
    • 2010年5月
    • 2010年4月
  • カテゴリー

    • C#
    • jQuery
    • OpenCV
    • raspberry pi
    • SharePoint
    • Silverlight
    • SQL Server
    • WCF
    • WPF
    • プログラミング
    • 未分類
    • 雑記
© astel-labs.net. Proudly Powered by WordPress | Nest Theme by YChong

このブログ内で公開されているソースコードおよびサンプルプログラムに関わるライセンスはすべて修正BSDライセンス(New BSD License)として公開しています。
但し、サンプルプログラムに含まれる外部アセンブリが同様のライセンスとは限りませんので、利用する前に必ずすべてのライセンスの確認を行ってください。