-
C++とOpenCVで動画のFPS値を取得する方法をわかりやすく解説
OpenCVで動画のFPS(Frames Per Second:1秒あたりのフレーム数)を取得するには、VideoCaptureクラスが提供するget()メソッドを使用します。引数にはCAP_PROP_FPSを指定します。このプロパティは、対象動画のFPS値を返します。プログラムの冒頭では、FPS値を格納するための整数型変数「FPS」を宣言しています。その後、FPS = cap.get(CAP_PROP_FPS);という処理によって、取得したFPS値を変数に保存します。以下のサンプルプログラムは、指定した動画ファイルのFPSを取得し、コンソールウィンドウに表示するものです。サンプルコード#in
-
C++を使ってOpenCVにトラックバーを追加する方法
トラックバー(Trackbar)は、OpenCVでさまざまなパラメータを直感的に操作するためのスライダー型のUI部品です。トラックバーを活用すれば、ソースコード内の数値をその都度書き換えて再コンパイルする必要がなくなり、明るさやコントラストなどのパラメータをマウス操作だけでグラフィカルに調整できます。これにより、リアルタイムに変化を確認しながら動的な画像エフェクトを作成することが可能になります。 以下のプログラムは、C++を使ってOpenCVウィンドウにトラックバーを追加し、画像の明るさとコントラストを動的に変更する例です。 サンプルコード #include<iostream> #
-
C++とOpenCVを使って画像を回転させる方法
OpenCVによる画像回転の基本OpenCVに組み込まれた関数を使用すれば、画像の回転は非常に簡単な作業です。画像を回転させるには、「highgui.hpp」と「imgproc.hpp」の2つのヘッダーファイルを読み込みます。本プログラムでは、これらに加えて画像の回転処理に関わる複数の関数を紹介します。以下のプログラムは、C++でOpenCVを使用して画像を回転させる方法を示しています。サンプルコード#include<iostream> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/i
-
C++とOpenCVで画像のサイズ変更・境界線の追加・回転をトラックバーで行う方法
この記事では、OpenCVのトラックバー(Trackbar)の別の活用例を紹介します。トラックバーを使って画像のサイズを変更し、画像に境界線(ボーダー)を追加するとともに、トラックバーを操作して境界線のサイズや種類を変更する方法を解説します。以下のプログラムを使用すると、画像のサイズ変更、境界線の追加、境界線のサイズ変更に加えて、画像の回転まで行うことができます。基本的な流れは前回の例と似ていますが、今回は複数のスライダーを同じウィンドウ上に追加する方法をデモンストレーションしています。サンプルコード#include<iostream> #include<opencv2/hi
-
C++とOpenCVを使って動画を回転させる方法
OpenCVにおける動画の回転処理は、画像を回転させる場合と基本的に同じ仕組みです。唯一の違いは、静止画像を画像行列(Mat)に読み込む代わりに、動画ファイルを読み込むか、カメラから映像ストリームを取得するという点です。この記事では、動画ファイルを読み込むのではなく、カメラで撮影した映像をリアルタイムに回転させて表示します。もし既存の動画ファイルを使用したい場合は、VideoCaptureの引数に動画ファイルのパスを正しく指定するだけで対応できます。また、トラックバー(スライダー)を追加することで、実行中に回転角度を自由に変更できるようにしています。回転角度の初期値は180度に設定されており、
-
C++とOpenCVでマウスイベントを処理する方法|マウスポインタの追跡とクリック検出
OpenCVにおけるマウスイベント処理とはマウスイベントは、OpenCVが提供する最も便利な機能のひとつです。OpenCVを使えば、マウスポインタの現在位置をリアルタイムで追跡できるだけでなく、左クリック・右クリック・中クリックといった操作の検出も可能です。OpenCVはロボティクスやコンピュータビジョンの分野で幅広く活用されており、これらの分野ではマウスポインタやクリック操作の追跡が頻繁に利用されます。たとえば、画像上の関心領域(ROI)をマウスでドラッグして指定したり、特定の座標をクリックしてオブジェクトを選択したりするインタラクティブな処理がその代表例です。本記事では、画像上のマウスポイ
-
C++とOpenCVで特定の色を検出する方法を解説
この記事では、C++とOpenCVを使用して、カメラ映像の中から特定の色を検出し、その色を基準にオブジェクトを追跡する方法を解説します。 ただし、色検出や色ベースのトラッキングシステムの性能は実行環境に大きく依存します。部屋の照明を変えたり背景色を変更したりすると、検出精度に大きな影響が及ぶ点に注意してください。 色検出の基本的な流れ OpenCVで色を検出する際は、一般的に次のような手順を踏みます。 カメラから映像(フレーム)を取得する BGR形式の画像をHSV形式に変換する inRange()関数で指定した色の範囲だけを抽出する(二値化) モルフォロジー演算でノイズを除去する 結果を画面
-
OpenCVとC++を使った色追跡の実装方法:HSV変換から軌跡の描画まで
色追跡(カラートラッキング)は、色検出とよく似た画像処理です。追跡を実現するには、検出したオブジェクトの面積を計算し、その領域の現在位置を求める処理を数行追加します。最後に、OpenCVのline()関数を使って、オブジェクトが移動した軌跡を線として描画します。 この記事では、トラックバーでHSVのしきい値をリアルタイムに調整しながら、Webカメラの映像から特定色のオブジェクトを検出し、その動きを追跡する方法を解説します。 色追跡の基本的な流れ 映像の取得:VideoCaptureクラスでWebカメラからフレームを取得します。 HSVへの変換:cvtColor()関数でBGR画像をHSV形
-
C++とOpenCVを使って静止画から顔を検出する方法をわかりやすく解説
OpenCVでは、画像から顔を検出することができます。顔検出には「detectMultiScale()」関数を使用します。 この関数の基本的な書式は以下の通りです。 構文 detectMultiScale(ソース行列, ベクター, 検出スケール係数, 最小近傍数, フラグ, 最小特徴サイズ) 引数を変更することで、「detectMultiScale()」関数の動作を細かく制御できます。各引数の役割は次の通りです。 ソース行列(Source Matrix) 顔を検出する対象となる行列です。この場合、画像データを保持している行列を指定します。 ベクター(Vector) 「detectMultiSc
-
C++とOpenCVを使って画像内の顔の数を数える方法
OpenCVを利用すれば、画像に写っている顔の数を数えるのはとても簡単です。実は、前章で作成した顔検出プログラムには、すでに検出した顔の数の情報が含まれています。その情報は faces.size() というコードで取得でき、このコードは整数値(int型)を返します。例えば、int x = faces.size(); と記述すれば、変数 x には画像から検出された顔の数が格納されます。以下のプログラムは、指定した画像から顔の数を計算し、その結果をコンソール画面に表示するものです。サンプルコード#include<iostream> #include<opencv2/highgui
-
C++とOpenCVで検出した顔をトリミング(切り抜き)する方法
この記事では、OpenCVを使って検出した顔をトリミング(切り抜き)する方法を解説します。検出した顔を切り抜くには、複数の行列(Mat)が必要になります。最も適切な方法は、画像の配列を使用することです。必要な行列(Mat)の宣言本プログラムでは、次の2行のコードで2つの画像行列を宣言しています。Mat cropped_faces[4];Mat faceROI[4];1つ目の行列「cropped_faces」は切り抜いた画像を保存するためのもので、2つ目の行列「faceROI」は関心領域(ROI:Region of Interest)を定義するために使用します。顔領域の切り抜き処理の流れ検出処理
-
C++とOpenCVを使って画像内の最大の顔を検出する方法
このチュートリアルでは、画像の中から最も大きい顔だけを検出する方法を解説します。基本的な処理の流れは通常の顔検出と同じですが、ここでは追加で Rect構造体 と forループ を組み合わせることで、複数検出された顔の中から最大のものを特定する点がポイントです。最大の顔を切り出す仕組み顔領域を切り出す関数の基本的な書式は以下の通りです。Mat faceROI = image_with_humanface(maxRect)maxRect には、画像内で検出された最大の顔の位置(座標)とサイズ(面積)の情報が格納されています。上記の1行は、元画像から maxRect が示す領域を同じ位置のまま切り取
-
C++とOpenCVを使って顔の位置を追跡する方法
顔の位置を追跡したい場合、楕円で顔を囲む方法が効果的です。楕円には中心点が存在し、この中心が検出された顔の中心点と一致するため、顔の位置追跡をより正確に行うことができます。以下のプログラムでは、検出された顔の中心を追跡し、その位置をコンソールウィンドウに表示します。サンプルコード#include<iostream> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> //このヘッダーにはrectangle()関数の定義が含まれています// #include&l
-
C++とOpenCVで実現するリアルタイム顔検出の方法を解説
リアルタイムでの顔検出は、静止画における顔検出と基本的な仕組みはほぼ同じです。最大の違いは、リアルタイム顔検出ではカメラからの動画ストリームを扱う必要があるという点です。 本プログラムでは「VideoCapture()」関数を使用しています。この関数はカメラから動画をキャプチャし、取得したフレームを一時的に行列(Mat)に格納します。ここではデフォルトのカメラから動画をキャプチャし、フレームを「video_stream」行列に順次読み込みながら処理を行います。 リアルタイム顔検出のサンプルコード 以下のプログラムは、Webカメラの映像から人間の顔をリアルタイムで検出するものです。 #incl
-
C++とOpenCVでリアルタイム顔追跡を実現する方法
本記事では、OpenCVを使ってリアルタイムで顔を追跡する方法を解説します。このプログラムは前回の顔検出プログラムと基本的な構造は同じですが、大きく2つの点が異なります。 顔を識別する際に、長方形(rectangle)の代わりに楕円(ellipse)を使用している点 検出した顔の座標をコンソールウィンドウに表示するための cout 文を追加している点 リアルタイム顔検出プログラム 以下は、Webカメラの映像からリアルタイムで人間の顔を検出・追跡するC++プログラムの完全なコードです。 #include<iostream> #include<opencv2/highgui/
-
C++とOpenCVで目を検出する方法|Haarカスケード分類器の使い方を解説
OpenCVを使えば、カメラ映像から顔や目をリアルタイムに検出することができます。本記事では、C++言語とOpenCVを組み合わせて目を検出する方法を、実際のサンプルコードとともに詳しく解説します。 目の検出に必要な準備 目の検出には、OpenCVに標準で同梱されているhaarcascade_eye.xmlというカスケード分類器を使用します。このファイルは、OpenCVをインストールしたフォルダ内の「C:/opencv/sources/data/haarcascades」ディレクトリに格納されています。 また、プログラムには以下のヘッダーファイルをインクルードする必要があります。 &
-
C++とOpenCVで目の位置をリアルタイムに追跡する方法
この記事では、OpenCVを使ってカメラ映像から目の位置を追跡する方法を解説します。目のトラッキングの基本的な考え方OpenCVによる目の検出が完了していれば、その後のトラッキングは非常にシンプルな作業です。この手法では、検出した目を円で囲み、その円の中心を追跡することで目の中心位置を把握します。円の中心を追跡するためには、X座標とY座標を保持する2つの整数型変数が必要になります。これらはmain()関数内の冒頭2行(9行目と10行目)で宣言されており、変数名は「x_axis」と「y_axis」です。コードの42行目と43行目では、検出した目の水平方向・垂直方向の座標値がそれぞれx_axisと
-
C++とOpenCVで眼球の動きを検出・追跡する方法をわかりやすく解説
はじめにこの記事では、OpenCVとC++を組み合わせて、Webカメラの映像から眼球の動きを検出し、その位置をリアルタイムに追跡する方法を解説します。顔認識でおなじみのHaarカスケード分類器と、円検出に有効なハフ変換(Hough Transform)を組み合わせることで、瞳の動きを安定的に捉えることができます。処理の全体フロー本プログラムは、以下のステップで眼球の検出・追跡を行います。顔の検出: Haarカスケード分類器(haarcascade_frontalface_alt.xml)で映像から顔領域を検出します。目の検出: 検出した顔領域に対して目用のカスケード(haarcascade_e
-
C++で配列の全ウィンドウサイズにおける「最小値の最大値」を求める方法
問題の概要サイズnの整数配列arr[]が与えられたとき、ウィンドウサイズを1からnまで変化させながら、それぞれのサイズにおける「最小値の最大値」を求めるのが本問題です。具体的には、各ウィンドウサイズkについて、配列内に存在するすべての長さkの連続部分配列(ウィンドウ)を調べ、その最小値を記録します。さらに、それらの最小値の中から最大のものを取り出して出力します。入力例arr[] = {4, 1, 2, 4, 5, 1, 2, 4}出力例5 4 2 1 1 1 1 1計算過程の解説ウィンドウサイズ : 1 => ウィンドウ { (4), (1), (2), (4), (5), (1), (
-
C++で解く「家からの最大窃盗価値」問題:動的計画法による効率的な解法
この問題では、n軒の家があり、それぞれの家には何らかの価値が保管されています。私たちの課題は、家々から盗むことができる最大の価値を見つけることです。 問題の説明 houses[] という配列には、各家に保管されている価値が格納されています。泥棒はこれらの家を次々と襲いますが、隣人が盗難に気づいてしまうため、隣り合う2軒から連続して盗むことはできません。この制約の中で、泥棒が捕まらずに盗むことのできる最大の合計価値を求める必要があります。 具体例で問題を理解しましょう。 入力 houses[] = {5, 2, 1, 6, 7, 9, 4, 3} 出力 23 説明 5、6、9、3 の