PR

【C#入門】カメラから画像を取得して画面に映像を表示しよう!

はじめに

C#は、多機能で使いやすいプログラミング言語であり、特にWindowsアプリケーションの開発において広く使用されています。今回は、C#を使ってカメラから画像を取得し、それを画面に表示する方法について紹介します。このチュートリアルでは、Webカメラを利用してリアルタイムで映像をキャプチャし、Windowsフォームアプリケーションに表示する基本的な手順を説明します。

このプロジェクトを通じて、以下の内容を学びます:

  • C#でのWebカメラ操作
  • Windowsフォームアプリケーションの作成
  • 映像のキャプチャと表示

では、さっそく始めましょう。

環境の準備

まずは開発環境を整えましょう。必要なソフトウェアとツールは以下の通りです。

必要なソフトウェア

  • Visual Studio:C#の開発環境として広く使用されるIDEです。無料版のVisual Studio Communityを使用することもできます。
  • AForge.NETフレームワーク:画像処理やコンピュータビジョン、カメラ操作をサポートするライブラリです。

AForge.NETのインストール

AForge.NETフレームワークをプロジェクトに追加するために、NuGetパッケージマネージャーを使用します。以下の手順に従ってください:

  1. Visual Studioを開き、新しいWindowsフォームアプリケーションプロジェクトを作成します。
  2. プロジェクトが作成されたら、ツールメニューからNuGet パッケージ マネージャーを選択し、ソリューション用のNuGet パッケージの管理をクリックします。
  3. 検索ボックスにAForge.Videoと入力し、検索結果からAForge.VideoAForge.Video.DirectShowをインストールします。

プロジェクトの作成

次に、カメラから画像を取得し、それを画面に表示するためのコードを書いていきます。

フォームデザイン

まずは、フォームデザインを設定します。Visual Studioのデザイナーを使って、フォームにPictureBoxコントロールを追加し、そこにカメラの映像を表示します。

  1. フォームにPictureBoxを追加します。
  2. PictureBoxのNameプロパティをpictureBoxに変更します。

コードの記述

次に、カメラを操作するためのコードを追加します。フォームのコードビハインドファイル(通常はForm1.cs)に以下のコードを追加します。

using System;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;

namespace CameraApp
{
    public partial class Form1 : Form
    {
        private FilterInfoCollection videoDevices;
        private VideoCaptureDevice videoSource;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (videoDevices.Count == 0)
            {
                MessageBox.Show("カメラが見つかりませんでした");
                return;
            }

            videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
            videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
            videoSource.Start();
        }

        private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
            pictureBox.Image = bitmap;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (videoSource != null && videoSource.IsRunning)
            {
                videoSource.SignalToStop();
                videoSource.WaitForStop();
            }
        }
    }
}

このコードでは、フォームがロードされたときにカメラを検出し、映像のキャプチャを開始します。新しいフレームがキャプチャされるたびに、PictureBoxに表示されます。また、フォームが閉じられる際にはカメラのキャプチャを停止します。

実行とデバッグ

コードを記述したら、プロジェクトをビルドして実行します。カメラが正常に検出されれば、リアルタイムで映像が表示されるはずです。もし映像が表示されない場合は、以下の点を確認してください:

  • カメラが正しく接続されているか
  • 他のアプリケーションがカメラを使用していないか
  • 必要なNuGetパッケージが正しくインストールされているか

カメラ操作の拡張

ここまでで基本的なカメラ操作と映像の表示ができましたが、さらに機能を拡張してみましょう。

カメラの切り替え

複数のカメラが接続されている場合、使用するカメラを選択できるようにします。コンボボックスをフォームに追加し、利用可能なカメラをリスト表示します。

  1. フォームにComboBoxコントロールを追加し、NameプロパティをcomboBoxCamerasに設定します。
  2. Form1_Loadメソッドを以下のように変更します:
private void Form1_Load(object sender, EventArgs e)
{
    videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    if (videoDevices.Count == 0)
    {
        MessageBox.Show("カメラが見つかりませんでした");
        return;
    }

    foreach (FilterInfo device in videoDevices)
    {
        comboBoxCameras.Items.Add(device.Name);
    }

    comboBoxCameras.SelectedIndex = 0;
    StartCamera();
}

private void StartCamera()
{
    if (videoSource != null && videoSource.IsRunning)
    {
        videoSource.SignalToStop();
        videoSource.WaitForStop();
    }

    videoSource = new VideoCaptureDevice(videoDevices[comboBoxCameras.SelectedIndex].MonikerString);
    videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
    videoSource.Start();
}

private void comboBoxCameras_SelectedIndexChanged(object sender, EventArgs e)
{
    StartCamera();
}

画像の保存

キャプチャした画像を保存する機能を追加します。ボタンをフォームに追加し、クリックイベントで画像を保存します。

  1. フォームにButtonコントロールを追加し、NameプロパティをbuttonSaveTextプロパティを保存に設定します。
  2. buttonSave_Clickイベントハンドラーを追加し、以下のコードを記述します:
private void buttonSave_Click(object sender, EventArgs e)
{
    if (pictureBox.Image != null)
    {
        SaveFileDialog saveFileDialog = new SaveFileDialog();
        saveFileDialog.Filter = "JPEG Image|*.jpg|Bitmap Image|*.bmp|PNG Image|*.png";
        saveFileDialog.Title = "画像を保存";
        saveFileDialog.ShowDialog();

        if (saveFileDialog.FileName != "")
        {
            pictureBox.Image.Save(saveFileDialog.FileName);
        }
    }
    else
    {
        MessageBox.Show("保存する画像がありません");
    }
}

まとめ

今回は、C#を使ってWebカメラから画像を取得し、Windowsフォームアプリケーションに表示する方法を紹介しました。基本的なカメラ操作から始め、複数のカメラの切り替えや画像の保存といった機能を実装しました。このチュートリアルを通じて、C#での画像処理やカメラ操作の基本的なスキルを習得できたことでしょう。

さらに学びたい方は、AForge.NETフレームワークのドキュメントを参照し、より高度な画像処理やコンピュータビジョンの技術を学んでみてください。C#の力を最大限に活用して、魅力的なアプリケーションを作成することができるでしょう。

最後に、開発したアプリケーションを他の人と共有し、フィードバックをもらうことで、さらに改良を加えていくことをお勧めします。プログラミングの世界では、学び続けることが重要です。新しい技術やライブラリに挑戦し、自分のスキルを磨いていきましょう。

タイトルとURLをコピーしました