はじめに
OpenCVは、画像処理やコンピュータビジョンのための強力なオープンソースライブラリです。C#でOpenCVを使用すると、カメラ映像のキャプチャや表示など、さまざまな画像処理タスクを簡単に実装できます。本記事では、C#を使用してOpenCVでカメラ映像をキャプチャし、画面に表示する方法について詳しく解説します。初心者向けに、環境構築から基本的なコードの実装方法まで順を追って説明します。
環境構築
OpenCVとは?
OpenCV(Open Source Computer Vision Library)は、リアルタイムのコンピュータビジョンに特化したライブラリで、さまざまな画像処理機能を提供します。C#では、Emgu CVというラッパーライブラリを使用してOpenCVの機能を利用します。
必要なツールとライブラリのインストール
C#でOpenCVを使用するために、以下のツールとライブラリをインストールします。
- Visual Studio
- .NET Framework
- Emgu CV
Visual Studioのインストール
Visual Studioは、C#を開発するための統合開発環境(IDE)です。Microsoftの公式サイトから無料でダウンロードできます。
Emgu CVのインストール
Emgu CVは、OpenCVをC#で使用するためのラッパーライブラリです。NuGetを使用してインストールします。
- Visual Studioで新しいプロジェクトを作成します。
- ソリューションエクスプローラーでプロジェクト名を右クリックし、「NuGetパッケージの管理」を選択します。
- 「参照」タブで「Emgu.CV」を検索し、インストールします。
- 同様に「Emgu.CV.UI」および「Emgu.CV.Bitmap」もインストールします。
カメラ映像のキャプチャ
カメラの初期化
まず、カメラを初期化し、映像をキャプチャする準備を行います。以下のコードでは、VideoCapture
クラスを使用してカメラを初期化します。
using System;
using Emgu.CV;
using Emgu.CV.Structure;
class Program
{
static void Main()
{
// カメラを初期化
VideoCapture capture = new VideoCapture();
// カメラが正常に初期化されたか確認
if (!capture.IsOpened)
{
Console.WriteLine("カメラを開くことができませんでした。");
return;
}
Console.WriteLine("カメラを初期化しました。");
}
}
この例では、VideoCapture
クラスを使用してデフォルトのカメラを初期化し、カメラが正常に初期化されたかどうかを確認しています。
カメラ映像のキャプチャと表示
次に、カメラ映像をキャプチャし、画面に表示するコードを実装します。VideoCapture
クラスのQueryFrame
メソッドを使用して、フレームをキャプチャします。
using System;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.UI;
class Program
{
static void Main()
{
// カメラを初期化
VideoCapture capture = new VideoCapture();
// カメラが正常に初期化されたか確認
if (!capture.IsOpened)
{
Console.WriteLine("カメラを開くことができませんでした。");
return;
}
// ウィンドウを作成
string windowName = "Camera";
CvInvoke.NamedWindow(windowName);
// 映像をキャプチャして表示
while (true)
{
// フレームをキャプチャ
Mat frame = new Mat();
capture.Retrieve(frame, 0);
// 映像を表示
CvInvoke.Imshow(windowName, frame);
// 'q'キーが押されたらループを終了
if (CvInvoke.WaitKey(30) == 'q')
{
break;
}
}
// ウィンドウを破棄
CvInvoke.DestroyWindow(windowName);
}
}
この例では、カメラ映像を連続してキャプチャし、CvInvoke.Imshow
メソッドを使用して画面に表示しています。'q'
キーが押されるまでループを継続し、キーが押されたらループを終了してウィンドウを閉じます。
カメラ映像の処理
グレースケール変換
カメラ映像をグレースケールに変換して表示する方法を紹介します。CvInvoke.CvtColor
メソッドを使用して、カラーフレームをグレースケールフレームに変換します。
using System;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.UI;
class Program
{
static void Main()
{
// カメラを初期化
VideoCapture capture = new VideoCapture();
// カメラが正常に初期化されたか確認
if (!capture.IsOpened)
{
Console.WriteLine("カメラを開くことができませんでした。");
return;
}
// ウィンドウを作成
string windowName = "Camera - Grayscale";
CvInvoke.NamedWindow(windowName);
// 映像をキャプチャして表示
while (true)
{
// フレームをキャプチャ
Mat frame = new Mat();
capture.Retrieve(frame, 0);
// グレースケールに変換
Mat grayFrame = new Mat();
CvInvoke.CvtColor(frame, grayFrame, ColorConversion.Bgr2Gray);
// 映像を表示
CvInvoke.Imshow(windowName, grayFrame);
// 'q'キーが押されたらループを終了
if (CvInvoke.WaitKey(30) == 'q')
{
break;
}
}
// ウィンドウを破棄
CvInvoke.DestroyWindow(windowName);
}
}
この例では、カメラからキャプチャしたフレームをグレースケールに変換し、グレースケール映像を画面に表示しています。
エッジ検出
カメラ映像に対してエッジ検出を行い、エッジを強調した映像を表示する方法を紹介します。CvInvoke.Canny
メソッドを使用してエッジ検出を行います。
using System;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.UI;
class Program
{
static void Main()
{
// カメラを初期化
VideoCapture capture = new VideoCapture();
// カメラが正常に初期化されたか確認
if (!capture.IsOpened)
{
Console.WriteLine("カメラを開くことができませんでした。");
return;
}
// ウィンドウを作成
string windowName = "Camera - Edge Detection";
CvInvoke.NamedWindow(windowName);
// 映像をキャプチャして表示
while (true)
{
// フレームをキャプチャ
Mat frame = new Mat();
capture.Retrieve(frame, 0);
// グレースケールに変換
Mat grayFrame = new Mat();
CvInvoke.CvtColor(frame, grayFrame, ColorConversion.Bgr2Gray);
// エッジ検出
Mat edgeFrame = new Mat();
CvInvoke.Canny(grayFrame, edgeFrame, 100, 200);
// 映像を表示
CvInvoke.Imshow(windowName, edgeFrame);
// 'q'キーが押されたらループを終了
if (CvInvoke.WaitKey(30) == 'q')
{
break;
}
}
// ウィンドウを破棄
CvInvoke.DestroyWindow(windowName);
}
}
この例では、カメラからキャプチャしたフレームをグレースケールに変換し、エッジ検出を行った結果を画面に表示しています。
カメラ映像の保存
映像の保存
キャプチャしたカメラ映像を動画ファイルとして保存する方法を紹介します。VideoWriter
クラスを使用して、映像を保存します。
using System;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.UI;
class Program
{
static void Main()
{
// カメラを初期化
VideoCapture capture = new VideoCapture();
// カメラが正常に初期化されたか確認
if (!capture.IsOpened)
{
Console.WriteLine("カメラを開くことができませんでした。");
return;
}
// 映像の保存設定
string outputFilePath = @"path\to\output\video.avi";
int frameWidth = (int)capture.Get(Emgu.CV.CvEnum.CapProp.FrameWidth);
int frameHeight = (int)capture.Get(Emgu.CV.CvEnum.CapProp.FrameHeight);
double fps = capture.Get(Emgu.CV.CvEnum.CapProp.Fps);
VideoWriter writer = new VideoWriter(outputFilePath, VideoWriter.Fourcc('M', 'J', 'P', 'G'), fps, new Size(frameWidth, frameHeight), true);
// ウィンドウを作成
string windowName = "Camera - Saving Video";
CvInvoke.NamedWindow(windowName);
// 映像をキャプチャして保存
while (true)
{
// フレームをキャプチャ
Mat frame = new Mat();
capture.Retrieve(frame, 0);
// 映像を表示
CvInvoke.Imshow(windowName, frame);
// フレームを保存
writer.Write(frame);
// 'q'キーが押されたらループを終了
if (CvInvoke.WaitKey(30) == 'q')
{
break;
}
}
// ウィンドウを破棄
CvInvoke.DestroyWindow(windowName);
writer.Dispose();
}
}
この例では、キャプチャしたカメラ映像を表示しながら、VideoWriter
クラスを使用して映像を動画ファイルとして保存しています。
まとめ
C#を使用してOpenCVでカメラ映像をキャプチャし、画面に表示する方法を解説しました。環境構築から基本的なコードの実装、カメラ映像の処理、そして映像の保存まで、さまざまなステップを具体的なコード例とともに紹介しました。OpenCVを使用することで、C#での画像処理やコンピュータビジョンの実装が容易になります。この記事を参考にして、さまざまなカメラ映像処理アプリケーションを開発してみてください。