手元にUSBカメラがあったので、C#でUSBカメラ画像の表示や保存する方法を試してみた時のメモ。
環境
- Windows7
- .NET Framework 4.5
- OpenCvSharp 2.4.9
- USBカメラ - Microsoft LifeCam VX-2000
という環境でコンソールアプリを作成しました。
事前調査
USBカメラの画像を扱う方法について分からなかったので調べてみたところ、OpenCV がメジャーなライブラリであると分かりました。
- OpenCvSharp
- Emgu CV
- OpenCV.Net
あたりがあるとのことでした。
そのうちのOpenCvSharpが、
- NuGet対応
- 日本人の方が開発者
- 開発者のブログやGitHubに情報あり
だったので、使ってみることにしました。
なお、NuGetでの導入方法は、開発者のブログに情報がありました。NuGetから入手できるようになり、環境を構築するのがだいぶ楽になったようです。
OpenCvSharpをつかう その17(NuGetで導入) - schima.hatenablog.com
準備
プロジェクトの設定
今回は32bit版で作ることにして、プロジェクトの設定を以下の通りにしておきます。
項目名 | 値 |
---|---|
対象のフレームワーク | .NET Framework 4.5 |
プラットフォームターゲット | x86 |
NuGetパッケージのインストール
以下の記事を参考に、OpenCvSharpのパッケージをインストールします。
OpenCvSharpをつかう その17(NuGetで導入) - schima.hatenablog.com
実装
W320 x H240 サイズのWindowを表示し、何かキーを押すとその時の画像が保存されるコンソールアプリになります。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenCvSharp; namespace WebCamConsole { class Program { static void Main(string[] args) { // CreateCameraCaptureの引数はカメラのIndex(通常は0から始まる) using (var capture = Cv.CreateCameraCapture(0)) { IplImage frame = new IplImage(); // W320 x H240のウィンドウを作る double w = 320, h = 240; Cv.SetCaptureProperty(capture, CaptureProperty.FrameWidth, w); Cv.SetCaptureProperty(capture, CaptureProperty.FrameHeight, h); // 何かキーを押すまでは、Webカメラの画像を表示し続ける while (Cv.WaitKey(1) == -1) { // カメラからフレームを取得 frame = Cv.QueryFrame(capture); // Window「Capture」を作って、Webカメラの画像を表示 Cv.ShowImage("Capture", frame); } // bmp以外にも、jpegやpngでの保存が可能 frame.SaveImage("result.bmp"); // 使い終わったWindow「Capture」を破棄 Cv.DestroyWindow("Capture"); } } } }
結果
7月下旬に購入した極早生リンゴの「ちなつ」の画像を撮ってみました。
起動時のスクリーンショット
保存された画像
ソースコード
GitHubに上げました。
CSharp-Sample/OpenCvSharpApp at master - thinkAmi/CSharp-Sample
なお、プロジェクトが2つ含まれていますが、現時点で使っているのはOpenCvSharpConsoleのみです。
参考
OpenCV公式
ShowImage / WaitKey メソッドなど
ユーザインタフェース — opencv 2.2 documentation
SaveImage / QueryFrame / SetCaptureProperty メソッドなど
また、LoadImageメソッドに保存や読み込みのできるファイル形式が記載されていました。
画像とビデオの読み込みと書き込み — opencv 2.2 documentation