C# + OpenCvSharp で、USBカメラ画像の表示や保存をしてみた

手元にUSBカメラがあったので、C#でUSBカメラ画像の表示や保存する方法を試してみた時のメモ。

 

環境

という環境でコンソールアプリを作成しました。

 

事前調査

USBカメラの画像を扱う方法について分からなかったので調べてみたところ、OpenCV がメジャーなライブラリであると分かりました。

 
次にC#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月下旬に購入した極早生リンゴの「ちなつ」の画像を撮ってみました。

起動時のスクリーンショット

f:id:thinkAmi:20140801041327p:plain

 

保存された画像

f:id:thinkAmi:20140731054816p:plain

 

ソースコード

GitHubに上げました。
CSharp-Sample/OpenCvSharpApp at master - thinkAmi/CSharp-Sample

なお、プロジェクトが2つ含まれていますが、現時点で使っているのはOpenCvSharpConsoleのみです。

 

参考

OpenCV公式

Python向けの資料ですが、C#も同じような意味でした。

 

ShowImage / WaitKey メソッドなど

ユーザインタフェース — opencv 2.2 documentation

 

SaveImage / QueryFrame / SetCaptureProperty メソッドなど

また、LoadImageメソッドに保存や読み込みのできるファイル形式が記載されていました。
画像とビデオの読み込みと書き込み — opencv 2.2 documentation

 

OpenCvSharp