【C++】OpenCVを用いてカメラ、動画から画像情報を取得する方法【画像処理】

スポンサーリンク
C++
スポンサーリンク

はじめに

今回はOpenCVを用いてカメラから画像情報を取得し、画像処理(エッジ検出)を施したものをウィンドウに表示するというプログラムを作成します。

エッジ検出等の処理についての説明は以前の記事で取り上げているので割愛し、画像情報の取得や画面への表示方法について説明していきたいと思います。

プログラムの手順

プログラムは次のようにして作られています。

  1. カメラの起動
    1. エラー処理
  2. ループ処理
    1. カメラから一フレーム読み込む(読み込めなければ終了)
    2. 読み込んだフレームをグレースケール画像に変換
    3. グレースケール画像からエッジ検出
    4. エッジ検出したものをウィンドウに表示
    5. 1msだけ待ってqキーが押されていればウィンドウを閉じてループ終了

ソースコード

#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
	cv::VideoCapture camera(0); //カメラの起動

	if(!camera.isOpened()){ //エラー処理
		 
		 std::cout << "camera.error" << std::endl;
		 return -1;
	}
	
	cv::Mat frame,gray,canny; //フレーム,グレースケール,エッジ検出用オブジェクト
	
	while(camera.read(frame)){ //ループ
	
		cvtColor(frame, gray, cv::COLOR_RGB2GRAY); //グレースケール化
	
		Canny(gray,canny, 50, 200); //エッジ検出
		
		cv::imshow("canny", canny); //画像の表示
		
		int key = cv::waitKey(1); //キー入力
		if(key == 'q'){
			
			cv::destroyWindow("canny"); //ウィンドウを閉じる
			camera.release();

			break; //whileループから抜ける
		}
	}
	
    return 0;
}

ソースコードの説明

カメラの起動

cv::VideoCapture オブジェクト名(0);

「VideoCapture」はビデオやカメラからキャプチャを行うためのクラスです。

オブジェクト名の後の数字はデバイスの番号を示しています。

「0」は内蔵カメラで、プログラムでは「camera」という名前で内蔵カメラのキャプチャを行なっています。

動画を読み込む場合には括弧内に動画のパスを与えます。

カメラが起動したか確認する

オブジェクト.isOpened()

「isOpened」はカメラのオープン、もしくは初期化に成功している場合には「true」を返す関数です。

プログラムでは、カメラが起動しているか確認するために使っています。

カメラから1フレーム取得する

オブジェクト.read(Matオブジェクト)

「read」は起動したカメラから1フレームを取得してMatオブジェクトに格納する関数です。

ウィンドウに画像を表示する

cv::imshow(ウィンドウ名, Matオブジェクト);

「imshow」は指定したウィンドウにMatオブジェクトの画像を表示する関数で、異なるウィンドウ名を指定することでウィンドウの数が増えます。

キー入力を待つ

cv::waitKey(ms);

「waitKey」は指定した時間キーの入力を待ち、キー入力があればそのキーが、なければ「-1」が格納されます。

時間の単位は「ms」です。

また、「0」は無限になってしまうため注意してください。

ウィンドウを閉じる

cv::destroyWindow(ウィンドウ名);

「destroyWindow」は指定したウィンドウを閉じる関数です。

最後に

環境次第かもしれませんが、自分の環境ではほとんど遅延もなく軽く動いていた印象です。

コメント

タイトルとURLをコピーしました