スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Webカメラの画像をc#で取り込む

「記事番号前後してませんか?」「気のせいですよ?」 Webカメラを75%OFFで購入したけれども、今に至るまで全く使っていなかったので、何か作ろう。 VisualStudio2015 Csharpを使って、WindowsFormにカメラの画像を表示するプログラムを作ります。 今更すぎるopenCV初体験。CSharpWindowsアプリも数個しか作ったことがないです。
プロジェクトを作る 特に変わったことはせず、Windowsフォームアプリケーションを選択。 ・NuGetからOpenCVSharpを適応させる。 ググってみたところ、 Google「やっぱりOpenCVだよねー!」 との事なので、OpenCVを入れます。 NuGetからレナさんのアイコンのopencvsharpを選び、プロジェクトにインストール。 詳細は作者様の記事を参照。

OpenCvSharpをつかう その17(NuGetで導入) http://schima.hatenablog.com/entry/2013/12/15/110513

実装する。 プログラムを書きます。次の記事を参考にしました。

C# + OpenCvSharp で、USBカメラ画像の表示や保存をしてみた http://thinkami.hatenablog.com/entry/2014/07/31/055508

あれ…コンソールアプリじゃん… え、コンソールで画面が出せるの… このプログラムを参考にしながら、Formアプリで実装するべき事を素人ながら列挙する。 ・一定時間ごとにカメラから画像を取り寄せる。 ・一定時間ごとに画面更新を呼び出す。 「一定時間ごと」を実装するために、タイマーを使う。 20160726_opencvcam0.jpg このように、コンポーネントとして用意されているので、ドラック&ドロップで貼り付ける。 以後、この記事では、このコンポーネントを「timer1」とします。 あとは、プロジェクト作成時から用意されているForm1のイベントを追加する。 「Load」「Paint」の2つをダブルクリック。 あとは「Form1_Load」「Form1_Paint」の中身などなど書いていく。 書いたプログラムを示します。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace CameraApp
{
    public partial class Form1 : Form
    {
        CvCapture camera;
        Bitmap bitmap = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            camera = Cv.CreateCameraCapture(1);

            timer1.Interval = 200;
            timer1.Tick += new EventHandler(Form1_tick);
            timer1.Enabled = true;
        }

        void Form1_tick(object Sender, EventArgs e)
        {
            IplImage frame = Cv.QueryFrame(camera);
            bitmap = BitmapConverter.ToBitmap(frame);
            Invalidate();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (bitmap != null)
                e.Graphics.DrawImage(bitmap, new Point(0, 0));
        }

        override
        protected void OnPaintBackground(PaintEventArgs e)
        {
            // nop
        }
    }
}
Form1_Loadの中身 Cv.CreateCameraCaptureでカメラの初期化をする。 通常は0を指定しますが、何故か僕の環境では(1)で初期化したところ、うまく行ったので、そう書いておきました。 2016/07/28追記:このPC内蔵カメラ持ってた。2つ目のカメラ、という扱いになるので、id1ですね。 他にも、タイマーの設定をしていたり。 「200ms間隔で。Form1_tickを呼び出すようにする。有効にする。」 コードそのまま。 ・Form1_tick 200ms間隔で呼び出されたメソッドは何をするか? Cv.QueryFrame(camera)で、カメラの画像を取り出している。 IplImage型はopencv固有の表現なので、BitmapConverter.ToBitmapでBitmapに変換する。 bitmapはクラスのメンバとして保持しておき、Form1_Paintで、このbitmapに書き換えてもらう。 ・Form1_Paint 変数bitmapを画面に書き込んでもらう。 ・override OnPaintBackground 中身からっぽのメソッドにオーバーライドすることで、再描画時のちらつきをなくします。

背景の描画を禁止して再描画時のちらつきをなくすには? http://www.atmarkit.co.jp/ait/articles/0408/19/news072.html

実行結果。 20160726_opencvcam1.jpg メモリが気になる・・・ GC.Collect();を呼び出せばいいだけなんですが。まぁいいか。

修正2017/8/17 -- ソースコードの表示にprettyprintを適用しました

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : 画像解析 C#

コメントの投稿

非公開コメント

ブログ移転のお知らせ
ブログをshonen.hateblo.jpに移転します. 新規の記事はこちらに投稿します.
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
635位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
94位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。