USBカメラで撮影しよう
Last updated
Was this helpful?
Last updated
Was this helpful?
USBカメラで周りを撮影するプログラム…と聞くとなんだか難しそうですが,OpenCVを使うととても簡単にプログラムを作ることが出来ます.
手順としては,
Webカメラへのアクセス
Webカメラから取り込む映像を表示するためのウィンドウの生成
生成したウィンドウの中に映像を描画
全ての処理が終了したらデバイス・メモリの解放
といった感じです.早速実装していきましょう.
作っていくプログラムのひな形です.まずはこれを入力してください.
前の章で「OpenCVで提供される関数にはcvが付く」という話をしました.
しかし,毎回毎回cv::hogehoge~なんて書くのは面倒です.ここでusing namespace cv;
というコードをmain関数の外に書いておくと,「cv::」を省くことができます. stdも同じで,std::と頭につく関数の「std::」を省いて書くことができるようになります.
みなさんの手持ちのPCには,インカメラが付いているでしょうか?それともカメラは何も付いていないでしょうか.
インカメラが付いているタイプのものは,自動でインカメラを使うようにOpenCV側がなんとかしてくれます.
インカメラがついていないPCを使っている人は,USBカメラを繋げて下さい.USBカメラが認識されれば,こちらもOpenCVが良きに計らってくれます.
main関数の中に,以下のコードを追加して下さい.
OpenCVには,VideoCaptureというWebカメラを容易に扱えることのできるクラス(※)が用意されています.
※クラスについては,このページの下に詳しい解説を書いておきました.気になる人は読んでみてください.
VideoCapture capture(0)と書けば,コンピュータがデフォルトで指定しているカメラデバイスにアクセスしてくれます.このときアクセスしたカメラに対して,VideoCaptureクラスの中で定義されている関数を使用することができます.
次のif文では,capture.isOpened()がfalseのとき,プログラムを止める
という処理が書かれています.
否定の条件式はfalseを使うことが多いかもしれませんが、条件の頭に!
をつけても否定の条件式になります.覚えておいたほうが良いでしょう.
isOpened()
は,VideoCaptureクラスで定義されている関数であり,USBカメラが認識できているかどうかを判断します.
先ほどカメラにアクセスするためにcaptureを定義しましたので,captureでアクセスしたカメラに対してisOpened()関数を使いますよ
,という意味でcapture.isOpened()という風に書きます.
さて,ここまででカメラのアクセスに関するプログラムは書くことができました.しかし,これだけでは本当にカメラの映像が取得できているのかわかりませんね.
実際にカメラの映像を画面上に表示するプログラムを書いてみましょう.先ほどのコードの下に,このようなプログラムを追加してみてください.
サンプルプログラムで出てきたMatを使用しています.ここでは,カメラの映像を画像として描画するためのframeという変数と,frameが取得した映像をコピーして保存しておくためのsrc_video
という変数を定義しています.
これからカメラの映像をもとにプログラムを改造していくのですが,カメラが取得した画像をそのまま加工する事は余りよろしくないため,src_videoを定義して,コピーした映像に対して処理を加えていくことになります.
namedWindow()関数
は,ウィンドウを生成するための関数です.引数はそれぞれ(ウィンドウの名前,ウィンドウのサイズ)です.
ここではウィンドウの名前をWindowNameという変数で定義をしています.WindowNameの中身を変更すれば好きな名前にすることができます.
ウィンドウのサイズは数値で細かく指定することもできます.今回のプログラムでは,ウィンドウの大きさを細かく指定する必要がないため,自動で適当なサイズに変形してくれるCV_WINDOW_AUTOSIZE
を指定しています.
While文の中身は,
captureで取得したカメラの映像をframeに入力する
src_videoにframeの画像をコピーする
src_videoの画像を,windowNameという名前のウィンドウで表示をする
1~3の処理を,キーボードのキーが押されるまで繰り返す
という処理を行っています.
C++では,ファイル入出力のための演算子として">>"が定義されています.
captureで取得したデータを,画像データとして出力するために>>演算子を使用しています.
ここまでプログラムを書くことができたら,F5キーを押してプログラムを実行してみましょう.
1.msvcp110d.dllがないと言われる
→Releaseモードで実行してみてください
2. OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file ……というメッセージがコンソール(黒い画面)に表示される
capture >> frame
のコード部分を以下のようにdo文で囲ってください
クラスを扱う前に,C言語の構造体について説明したほうが理解しやすいでしょう.
C言語では,構造体
という考え方が存在します.
構造体とは,プログラム中でよく使用するデータ型を定義しておいて,データの入出力を簡単にすることができるデータ構造です.
配列でも似たようなことができますが,配列ではすべてのデータに対し同一のデータ型(int型,double型…)しか使用することができません.
構造体では,構造体で定義したいデータに対して複数のデータ型を与えてあげることができます.
例を見てみましょう.
構造体のデータ(メンバ
といいます)を呼び出すとき,nagasaki_yuru[i].num
やnagasaki_yuru[i].name
のように書いています.
この書き方,capture.isOpened()
の書き方と似ていませんか?
クラス
とは構造体と非常に似ており,構造体のつくりをさらに拡張し,構造体が持つデータ型の中に関数を含めることができるようにしたものです.
クラスの中に含まれている関数はメンバ関数
と呼ばれ,クラス変数名.メンバ関数
といった形で呼び出すことができます.
クラスという考え方はC++だけではなく,JavaやC#などのプログラミング言語にも使用されています.