投稿

【OpenCV応用編 第2回】群衆の中から人を見つけ出す!歩行者検出(全身検出)に挑戦しよう 🚶

「顔が隠れていても、そこに『人』がいることを認識させたい!」 「監視カメラの映像から、人の数を数えるにはどうすればいいの?」 「顔検出以外にも、物体を検出する別の方法ってあるの?」 こんにちは! OpenCV探検隊、隊長のPythonistaです! 前回の第1回 では、顔というターゲットをさらに深掘りし、「目」や「笑顔」といった細かいパーツを検出する方法を学びましたね。 シリーズ第2回となる今回は、逆にグッと視野を広げて、人物の**「全身」**を検出する**歩行者検出 (Pedestrian Detection)** に挑戦します! これにより、あなたのプログラムは、カメラからの距離が遠かったり、人物が横を向いていたりして顔が見えなくても、その存在を捉えることができるようになります。この技術は、街中の人流解析や、セキュリティシステム、自動運転技術など、非常に多くの分野で活用されているんですよ。さあ、群衆の中から個人を認識する、新たなステップに進みましょう! 1. 今回の新しい武器:HOG + SVM 前回の顔や目の検出では、「ハールカスケード分類器」という武器を使いました。実は、全身を検出するためのハールカスケード(`haarcascade_fullbody.xml`)も存在するのですが、今回はより一般的に歩行者検出で高い性能を発揮する、別の強力な武器を紹介します。 それが、**HOG (Histogram of Oriented Gradients) 特徴量 + SVM (Support Vector Machine)** という組み合わせです。 HOG特徴量とは? ハールカスケードが画像の「明暗のパターン」を見ていたのに対し、HOGは**「輪郭の向きのパターン」**を見ます。画像の中の明るさが変化する方向(勾配)をたくさん集計し、「人の形は、だいたいこういう向きの輪郭線で構成されているよね」という特徴を捉えます。 例えるなら… ハールカスケードが「目と鼻の位置関係」で見分ける刑事なら、HOGは「全身のシルエット」で見分ける凄腕の探偵のようなものです。 SVMとは? SVMは、HOGによって抽出された「輪郭のパターン」が、果たして「人」のものなのか、それとも「人でない」ものなのか...

【OpenCV応用編 第1回】人の表情を読む!目と笑顔をリアルタイムで検出しよう 😊

イメージ
「顔が検出できるようになったけど、その人が笑っているかどうかも知りたい!」 「検出した顔の中から、さらに『目』だけを見つけ出すにはどうすればいい?」 「OpenCVの顔検出の知識を、もっと色々なことに応用してみたい!」 こんにちは! OpenCV探検隊、隊長のPythonistaです! 前回の入門シリーズでは、OpenCVを使って画像や動画から「顔」を検出する、コンピュータビジョンの基本的な手法をマスターしましたね。 今回から始まる**応用編シリーズ**では、その知識をさらに拡張し、顔以外の様々な物体を検出する冒険に出ます! 第1回となる今回のテーマは、顔という大きな枠の中から、さらに細かいパーツである**「目」と「笑顔」**を検出する技術です。これをマスターすれば、あなたのプログラムは単に人の存在を認識するだけでなく、「その人がどこを見ているか」「どんな表情をしているか」といった、より高度な情報を読み取れるようになります。さあ、人の表情を読み解く、新たな探検を始めましょう! 1. 今回の戦略:階層的検出で効率アップ! いきなり画像全体から小さな「目」を探し始めるのは、非常に効率が悪く、間違い(誤検出)も多くなります。例えるなら、日本全国の地図からいきなり特定の家の表札を探すようなものです。 そこで今回は、よりスマートな**「階層的検出 (Hierarchical Detection)」**というアプローチを取ります。 ステップ1(大規模探索): まず、画像全体から大きなターゲットである**「顔」**を見つけ出します。(=市を見つける) ステップ2(範囲の限定): 見つかった「顔」の領域だけを切り取って、**関心領域 (ROI - Region of Interest)** とします。 ステップ3(小規模探索): その小さな**顔のROIの中でのみ**、「目」や「笑顔」を探します。(=市の中だけで、特定の家を探す) この手順を踏むことで、処理速度が向上し、検出の精度も格段に上がります。 2. 準備:新しい学習済みモデル(XMLファイル)の入手 顔検出の時と同じように、今回もOpenCVが提供するハールカスケードの学習済みモデルを使います。「目」用と「笑顔」用のXMLファイルを、前回と同じ場所から...

【OpenCV物体追跡 第2回】実装!マウスで指定した物体をリアルタイムで追いかけよう 🖱️

「OpenCVのトラッカーの種類は分かったけど、具体的にどうやって使うの?」 「動画に表示された物体を、自分のマウスで『これを追跡して!』と指示したい!」 「OpenCVのウィンドウで、マウスのクリックやドラッグをどうやって検知するの?」 こんにちは! OpenCV探検隊、隊長のPythonistaです! 前回の第1回 では、「検出」と「追跡」の違いを学び、OpenCVに搭載されている個性豊かなトラッカーたちを紹介しましたね。これで、物体追跡の理論的な準備は万端です。 シリーズ第2回となる今回は、いよいよ**実践編**です! 理論をコードに落とし込み、**ユーザーがマウスで指定した任意の物体を、プログラムがリアルタイムで追跡し続ける**、そんなインタラクティブなアプリケーションをゼロから開発します。この記事を読み終える頃には、あなたは動画内の好きなターゲットをロックオンし、追跡するハンターのようなプログラムを操れるようになっているでしょう! 1. 今回の鍵:OpenCVでマウス操作を扱う方法 今回のプロジェクトの核心は、「ユーザーがマウスで描いた矩形(四角い領域)を、プログラムがどうやって知るのか?」という点です。これを実現するのが、`cv2.setMouseCallback()`という関数です。 これは、特定のウィンドウ(例: 'Tracking'という名前のウィンドウ)で**マウスに何か動きがあったとき(クリック、ドラッグ、ボタンを離すなど)に、あらかじめ指定しておいた関数(コールバック関数)を自動的に呼び出す**、という設定を行うための関数です。 この仕組みを使えば、「マウスの左ボタンが押されたら座標を記録開始」「マウスが動いたら矩形を描画」「ボタンが離されたら座標を確定」といった、インタラクティブな操作が可能になります。 2. 設計図:インタラクティブな追跡のロジック これから作成するプログラムは、以下のような流れで動作します。 動画ファイルを読み込み、最初のフレームを表示して一時停止する。 ユーザーがマウスをドラッグして、追跡したい物体の周りに矩形(ROI: Region of Interest, 関心領域)を描く。 ユーザーがキーボードのキー(例: Enterキー)を押して、...

【OpenCV物体追跡 第1回】検出から追跡へ!OpenCVに組み込まれた多様なトラッカーたちを紹介 🎯

「顔検出はできたけど、特定の一人の顔を追いかけ続けるにはどうすればいい?」 「動画の中のボールや車のように、自由に動く物体をプログラムで追跡したい!」 「物体追跡(トラッキング)って、物体検出と何が違うの?」 こんにちは! OpenCV探検隊、隊長のPythonistaです! 前回の入門シリーズ では、画像やリアルタイムの映像から「顔」を検出する、非常にエキサイティングな技術を学びましたね。 今回から始まる新シリーズでは、その技術をさらに一歩進め、**「物体追跡(オブジェクトトラッキング)」**の世界を探検します! 物体追跡とは、一度「これだ!」と決めた特定の物体を、フレームが変わっても、動き回っても、見失わずに追いかけ続ける技術のことです。これは、監視システムからスポーツ分析、ロボットの視覚まで、あらゆる分野で活用されるコンピュータビジョンの王道技術です。 第1回となる今回は、本格的な実装に入る前の準備運動として、 「検出」と「追跡」の根本的な違い OpenCVに標準で搭載されている、様々な追跡アルゴリズム(トラッカー)の種類と特徴 について、分かりやすく解説していきます。さあ、動くターゲットを捉えるための、新たな冒険を始めましょう! 1.「検出 (Detection)」と「追跡 (Tracking)」の違い まず、この2つの言葉の違いをしっかり理解することが重要です。これらは似ているようで、アプローチが全く異なります。 検出 (Detection) フレームごとに、画像全体をスキャンして「顔はどこか?」「人はどこか?」と、毎回ゼロから探します。状況が変化しても頑健ですが、毎フレーム全力を出すので**処理が重い**のが特徴です。 例えるなら… 広場にいる警備員が、1秒ごとに群衆全員の顔を一人ずつチェックして、指名手配犯を探すようなものです。 追跡 (Tracking) 最初のフレームで「この人を追跡せよ!」と一度だけ対象を指定します。次のフレームからは、画像全体を探すのではなく、「さっきあの人がいた場所の、すぐ近く」だけを集中して探し、対象を見つけます。そのため、**処理が非常に軽い**のが特徴です。 例えるなら… 警備員が、一度見つけた指...

【OpenCV入門 最終回】Webカメラでリアルタイム顔検出!動く映像をPythonで解析しよう 📸

「写真の顔が検出できたけど、これをリアルタイムの動画でやるにはどうすればいいの?」 「PythonでWebカメラの映像をどうやって扱えばいいんだろう?」 「自分の顔にリアルタイムで四角い枠が付いてくる、みたいなアプリを作ってみたい!」 こんにちは! OpenCV探検隊、隊長のPythonistaです! 前回の第2回 では、学習済みモデル(ハールカスケード)を使い、静止画像の中から人間の顔を検出するという、画像認識の核心的な技術をマスターしましたね。 シリーズ最終回となる今回は、その集大成として、これまで学んだ知識を**リアルタイムの動画**に応用します! この記事のゴールは、 PCに接続されたWebカメラの映像を取得し、そこに映る顔をリアルタイムで検出し続けるアプリケーション を開発することです。静的な「画像」から、動的な「映像」へと次元を上げることで、コンピュータビジョンの可能性が無限に広がることを実感できるはずです。さあ、あなたのプログラムに命を吹き込みましょう! 1. 基本的な考え方:「動画」は「静止画の連続」である 「リアルタイムの動画処理」と聞くと、何か特別な、難しい技術が必要に思えるかもしれません。しかし、基本的な考え方は非常にシンプルです。 動画とは、結局のところ、たくさんの静止画(フレーム)がパラパラ漫画のように高速で連続表示されているもの です。 つまり、リアルタイムの顔検出を実現するための処理の流れは、以下のようになります。 Webカメラから、その瞬間の映像を**1フレームだけ**キャプチャする。 その1枚のフレーム(静止画)に対して、 前回学んだのと全く同じ顔検出処理 を適用する。 顔に四角を描画した、処理済みのフレームを画面に表示する。 上記1〜3の処理を、プログラムが終了するまで超高速で**無限に繰り返す**。 これだけです! あなたは既に、この処理の最も重要な部分をマスターしているのです。 2. ステップ1:OpenCVでWebカメラにアクセスする OpenCVを使えば、Webカメラへのアクセスは驚くほど簡単です。 cv2.VideoCapture() という関数を使います。 import cv2 # Webカメラに接続する。引数0は、PCに内蔵されたデ...

【Pythonで画像認識入門 第2回】写真から「顔」を見つけ出せ!OpenCVを使った顔検出の基礎 🧑

イメージ
「プログラムに、画像の中から特定の『モノ』を見つけさせるにはどうすればいいの?」 「顔認識って、すごく難しいAIの技術じゃないの?」 「OpenCVを使えば、簡単な顔検出プログラムが作れるって本当?」 こんにちは! OpenCV探検隊、隊長のPythonistaです! 前回の第1回 では、PythonとOpenCVを使って画像を読み込み、表示し、簡単な加工を施すという、画像操作の基本をマスターしましたね。これで、画像という「素材」を自由に扱う準備が整いました。 シリーズ第2回となる今回は、いよいよその素材から「意味」を読み取る、**物体検出 (Object Detection)** の世界に足を踏み入れます! その最初のターゲットとして、コンピュータビジョンで最も有名でエキサイティングなテーマの一つ、**静止画像の中から人間の「顔」を自動で検出する**プログラムの作成に挑戦します。 「AIなんて難しそう…」と思うかもしれませんが、心配無用です。OpenCVに用意されている、あらかじめ訓練された「賢い分類器」を使えば、驚くほど少ないコードで、あなたのプログラムに顔を見つけ出す能力を与えることができますよ! 1. どうやって「顔」を見つけるの? ハールカスケード分類器の仕組み 本格的な実装に入る前に、OpenCVがどのようにして顔を検出するのか、その基本的な考え方だけを簡単に知っておきましょう。今回私たちが使うのは、**ハールカスケード (Haar Cascade) 分類器**という、非常に有名で古典的な手法です。 これは、あらかじめ何千、何万枚もの「顔の画像」と「顔でない画像」をコンピュータに学習させて作られた、**顔の特徴をまとめた学習済みモデル**です。 このモデルは、画像の中の小さな領域に対して、以下のような非常に単純な質問を何千回も繰り返します。 「目のあたりは、鼻筋のあたりより暗いか?」 「鼻筋のあたりは、頬のあたりより明るいか?」 これらの単純な特徴(ハール特徴量)の組み合わせを、滝(カスケード)のように連続してチェックしていき、全ての条件をクリアした領域を「これは顔である」と判断するのです。私たちは、この賢いモデルをありがたく使わせてもらうだけでOKです! 2. 準備:学習済みモデル(XMLファ...

【Pythonで画像認識入門 第1回】Pythonに「見る」力を!OpenCVの導入と画像の基本操作 👁️

「自動運転の車はどうやって白線や人を認識しているの?」 「スマホの顔認証って、どんな仕組みで動いているんだろう?」 「Pythonで、画像の中にあるものを自動で見つけ出すことってできるの?」 こんにちは! Python探検隊、隊長のPythonistaです! これまで私たちは、テキストデータや数値データを扱ってきましたが、今回から始まる新シリーズでは、全く新しい領域、**コンピュータビジョン(Computer Vision)**の世界を探検します! コンピュータビジョンとは、一言で言えば、**コンピュータに人間のような「視覚」を与える技術**のことです。そして、そのための最も強力でポピュラーな武器が、オープンソースライブラリである**OpenCV**です。このシリーズを通して、私たちはPythonとOpenCVを使い、プログラムに「見る」力を与える方法を学んでいきます。 第1回となる今回は、その壮大な冒険への第一歩。OpenCVをインストールし、**画像を読み込み、画面に表示し、簡単な加工を施して保存する**という、全ての基本となる操作をマスターします。さあ、デジタルの世界に目を開きましょう! 1. コンピュータビジョンとOpenCVって何? 1.1. コンピュータにとっての「画像」とは? 私たちが「美しい風景写真」として認識している画像も、コンピュータにとっては単なる**数字の羅列**に過ぎません。画像は、**ピクセル(画素)**と呼ばれる小さな色の点の集まりでできています。コンピュータは、この各ピクセルの色情報(例: 赤255, 緑100, 青50)を、巨大な**数値の行列(配列)**として扱っています。 コンピュータビジョンとは、この膨大な数値の行列から、人間が認識するような「意味のある情報」(顔、文字、物体など)を抽出し、理解するための技術分野なのです。 1.2. OpenCVの役割 OpenCV (Open Source Computer Vision Library) は、この複雑な画像処理を手助けしてくれる、非常に強力なライブラリです。本来なら難しい数学の計算が必要な処理(例: 顔の特徴点を探す、物体の輪郭を抽出する)を、OpenCVはたった一行のシンプルな関数で実行できるようにしてくれます。 2. 準備:Open...