C++とOpenCVでデフォルトカメラから映像をキャプチャする方法
この記事では、OpenCVを使ってデフォルトカメラにアクセスし、そのカメラからの映像ストリームを表示する方法を解説します。
デフォルトカメラとは
ノートパソコンの場合、内蔵されているWebカメラがデフォルトカメラになります。一方、デスクトップPCの場合は、カメラが接続されているシリアルポートの順番によってデフォルトカメラが決まります。
デフォルトのWebカメラから映像をキャプチャする場合、カメラに関する詳細な知識は必要ありません。カメラが正しく接続されていることだけを確認すればOKです。
サンプルコード
以下のプログラムは、デフォルトカメラから映像ストリームを取得し、リアルタイムで画面に表示します。
#include<opencv2/opencv.hpp>//VideoCaptureクラスを使用するためのOpenCVヘッダー//
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat myImage;//フレームを読み込むための行列を宣言//
namedWindow("Video Player");//映像を表示するウィンドウを宣言//
VideoCapture cap(0);//デフォルトカメラからフレームのストリームを取得するオブジェクトを宣言//
if (!cap.isOpened()){ //映像ストリームが見つからない場合にエラーメッセージを表示//
cout << "No video stream detected" << endl;
system("pause");
return-1;
}
while (true){ //映像を表示し続けるための無限ループ//
cap >> myImage;
if (myImage.empty()){ //フレームが検出されない場合はループを抜ける//
break;
}
imshow("Video Player", myImage);//映像を表示//
char c = (char)waitKey(25);//25ミリ秒のフレーム処理時間を確保し、中断条件を設定//
if (c == 27){ //'Esc'キーが押されたらループを抜ける//
break;
}
}
cap.release();//バッファメモリを解放//
return 0;
}コードのポイント
このプログラムの重要なポイントを簡単に整理しておきましょう。
- VideoCapture cap(0):引数「0」を指定することで、デフォルトカメラを開きます。カメラが複数接続されている場合は、番号を変更することで別のカメラを選択できます。
- cap.isOpened():カメラが正常に開けたかどうかをチェックします。開けない場合はエラーメッセージを表示して終了します。
- waitKey(25):各フレームに25ミリ秒の処理時間を与えます。この値を調整することで、再生速度をある程度制御できます。
- Escキー(ASCIIコード27):ループの終了条件として機能し、キー入力でプログラムを安全に停止できます。
実行結果
このプログラムを実行すると、デフォルトカメラの映像ストリームがリアルタイムでモニター上に表示されます。「Esc」キーを押すと、プログラムは終了します。
-
C++とOpenCVで二値画像(バイナリイメージ)を反転する方法
二値画像(バイナリイメージ)の反転とは、ピクセル値を逆転させる処理のことです。視覚的な観点から見ると、二値画像を反転させると、白いピクセルは黒へ、黒いピクセルは白へと変換されます。この処理は、主に3つの関数を組み合わせて実現します。それぞれの手順を順番に見ていきましょう。ステップ1:カラー画像をグレースケールに変換するまず、cvtColor()関数を使って元の画像をグレースケール画像に変換します。この関数の基本形は次の通りです。cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);ステップ2:グレースケール画像を二値化する続いて、グ
-
C++とOpenCVでバイナリ画像(二値画像)を作成する方法を解説
バイナリ画像(二値画像)とは、黒と白の2色のみで表現されるデジタル画像のことです。画像処理の観点から見ると、バイナリ画像は「0」と「1」という2つの値しか持たないピクセルで構成されています。ピクセルの値が0の場合は純粋な黒を、値が1の場合は純粋な白を表します。グレースケール画像では、各ピクセルが256段階の異なる値を持つのに対し、バイナリ画像では2つの値しか存在しません。このシンプルさゆえに、バイナリ画像はさまざまな用途で活用されています。例えば、モルフォロジー変換(形態学的処理)ではバイナリ画像が必要であり、背景から物体の形状を抽出する処理にもバイナリ画像が用いられます。OpenCVを使用す