C++とOpenCVを使って画像内の顔の数を数える方法
OpenCVを利用すれば、画像に写っている顔の数を数えるのはとても簡単です。実は、前章で作成した顔検出プログラムには、すでに検出した顔の数の情報が含まれています。その情報は faces.size() というコードで取得でき、このコードは整数値(int型)を返します。
例えば、int x = faces.size(); と記述すれば、変数 x には画像から検出された顔の数が格納されます。
以下のプログラムは、指定した画像から顔の数を計算し、その結果をコンソール画面に表示するものです。
サンプルコード
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/objdetect/objdetect.hpp>
//このヘッダーにはCascadeClassifierの定義が含まれています//
#include<string>
using namespace std;
using namespace cv;
int main(int argc, char** argv){
Mat image_with_humanface;//人の顔が写った画像を読み込むための行列を宣言//
image_with_humanface = imread("friends.jpg");//人の顔が含まれる画像を読み込む//
string trained_classifier_location = "C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";//学習済みXML分類器の場所を文字列として定義//
CascadeClassifier faceDetector;//CascadeClassifierクラスのオブジェクト「faceDetector」を宣言//
faceDetector.load(trained_classifier_location);//オブジェクトにXML学習済み分類器を読み込む//
vector<Rect>faces;//facesという名前の矩形ベクトルを宣言//
faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));//image_with_humanface行列内の顔を検出//
int x = faces.size();//顔の数を計算し、整数値をxに格納//
cout << "Number of face(s)in the image=" << x << endl;//コンソール画面にxの値を表示//
system("pause");//結果を確認できるようシステムを一時停止//
return 0;
}コードの解説
このプログラムの処理の流れは以下の通りです。
- 画像の読み込み:
imread()関数を使って、人の顔が写った画像ファイル(friends.jpg)を読み込みます。 - 分類器の準備: OpenCVに付属しているHaar Cascade分類器(haarcascade_frontalface_alt.xml)のパスを指定し、
CascadeClassifierオブジェクトに読み込みます。 - 顔の検出:
detectMultiScale()関数を実行することで、画像内の顔を検出し、その位置情報が矩形(Rect)のベクトルfacesに格納されます。 - 顔の数の取得: 検出された顔の数は
faces.size()で取得できます。これはベクトルの要素数、つまり検出された顔の領域の個数を表します。
実行結果
プログラムを実行すると、コンソール画面に以下のように画像内に検出された顔の数が表示されます。

このように、faces.size() を使うだけで、特別な追加処理を行うことなく簡単に画像内の顔の数を取得できます。人数カウントや統計分析など、さまざまな応用に活用できる便利な手法です。
-
C++とOpenCVを使って線を描画する方法
OpenCVで線を描画するには、始点と終点の2つの座標が必要です。さらに、線を描くためのキャンバス(描画領域)も用意しなければなりません。線を描画するために必要な要素OpenCVでは、キャンバスとして機能するのが行列(Mat)です。この行列に対して、線の始点と終点を定義し、加えて以下の情報も指定します。線の色線の太さつまり、OpenCVで線を描くには、行列・2つの点・色・線の太さという4つの要素を宣言しておく必要があります。必要なヘッダーファイルOpenCVで線を描画するには、<imgproc.hpp>ヘッダーをインクルードします。これは、line()関数がこのヘッダー内で定義され
-
C++とOpenCVで画像のチャンネル数を取得する方法を解説
この記事では、OpenCVを使って画像のチャンネル数を調べる方法について解説します。プログラムを実行すると、コンソール画面に画像のチャンネル数が表示されます。チャンネル数を取得するには、OpenCVが提供するchannels()メソッドを使用します。このメソッドは、Matクラスのオブジェクト(画像行列)に対して呼び出すことで、その画像のチャンネル数を整数値として返します。例えば、カラー画像の場合は通常3チャンネル(BGR)、グレースケール画像の場合は1チャンネルとなります。画像処理を行う際、扱っている画像がカラーかモノクロかを判別するために、チャンネル数の確認は非常に重要な処理の一つです。以下