C#でWEBカメラを使う AForge.NETによる方法

概要

AForge.NET Frameworkを使う.AForge.NET Frameworkは,コンピュータビジョンとか人工知能の分野の開発者・研究者向けのフレームワーク.DirectShowでビデオを読み込むクラスが実装されているので,それを使う.

手順

「Windows フォーム アプリケーション」を作成
AForge.NETのインストール

Nugetにパッケージがあるのでインストール.Nugetの使い方がわからない人はここらへんを参照.AForge.NET関連のパッケージは役割に応じてたくさんあるが,今回は「AForge.Controls」と「AForge.Video.DirectShow」を選択してインストール.すると,依存関係のあるパッケージもインストールされる.

VideoSourcePlayerのコントロールの配置

AForge.NETで用意されている動画表示用のコントロールVideoSourcePlayerを使う(Pictureboxとかでも表示可能ではあるが,表示するだけならVideoSourcePlayerの方が楽).

VideoSourcePlayerは,「AForge.Controls.dll」というDLLに入っている.Nugetでのインストールが済んでいれば,ソリューションフォルダの下の「package→AForge.Controls.X.X.X→lib→AForge.Controls.dll」とたどればあるはず.

ツールボックスの適当なところで右クリックして「アイテムの選択(I)...」を選択.「.NET Framework コンポーネント」タブの「参照(B)...」ボタンを押して,「AForge.Controls.dll」を選択したらOK.

するとツールボックスに「VideoSourcePlayer」というコントロールができているので,フォーム上に配置する.


ソースコード

以下,動作確認用プログラムのソースコード.わりと短いコードでWEBカメラからの映像表示が可能.プログラムを起動すると,キャプチャデバイスを選択するダイアログが表示され,選択すると映像が表示される.ボタンクリックによって,現在のフレームをファイルに保存できるようになっている.

using System;
using System.Windows.Forms;

using AForge.Video.DirectShow;

namespace AforgeNetTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // ビデオキャプチャデバイスを選択するダイアログの生成
            var form = new VideoCaptureDeviceForm();
            // 選択ダイアログを開く
            if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                // 選択されたデバイスをVideoSourcePlayerのソースに設定
                videoSourcePlayer1.VideoSource = form.VideoDevice;
                // ビデオキャプチャのスタート
                videoSourcePlayer1.Start();
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // 閉じるときの処理
            if (videoSourcePlayer1.VideoSource != null && videoSourcePlayer1.VideoSource.IsRunning)
            {
                videoSourcePlayer1.VideoSource.SignalToStop();
                videoSourcePlayer1.VideoSource = null;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 現在のフレームをビットマップに保存
            var bmp = videoSourcePlayer1.GetCurrentVideoFrame();
            bmp.Save("a.bmp");
        }
    }
}