はじめに
こんにちは、yamaです!
今回は「Python × OpenCV」を使って、画像認識にチャレンジしてみたいと思います。
以前、画像編集についての記事を書いたのですが、「画像を“見る”だけじゃなくて、どうやって“認識”するのか?」というところにも興味が出てきました。
Python初心者でも扱いやすいOpenCVを使って、顔認識やエッジ検出などの基礎的な処理を体験してみましょう!
やりたいこと
今回のブログでは、次のような画像認識を試します。
1.画像の読み込みと表示
2.エッジ検出(Cannyフィルタ)
3.顔認識(Haar分類器)
「画像認識ってなんか難しそう…」と思うかもしれませんが、OpenCVを使えば意外と簡単に試せます!
準備するもの
ライブラリ
今回使うのは以下のライブラリです:
・opencv-python
: 画像の読み込み・表示・処理・numpy
: 画像データの数値処理(行列演算)・matplotlib
: 画像の可視化(表示・比較用)インポート手順
ターミナルやAnaconda Promptなどで以下のコマンドを実行してください。
このライブラリの説明
- OpenCV: 画像処理ライブラリ。顔認識・物体検出など高機能。
- NumPy: Pythonの数値計算ライブラリ。画像データを行列として扱う。
- Matplotlib: グラフ描画ライブラリ。画像の可視化にも便利。
ディレクトリ構成
画像ファイル(今回は sample.jpg
)をスクリプトと同じフォルダに置いておくと楽です。
コードスクリプト
コードスクリプトの概要
import cv2 import numpy as np import matplotlib.pyplot as plt # 画像読み込み img = cv2.imread('sample.jpg') # エッジ検出(グレースケールに変換→Cannyフィルタ) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 100, 200) # 顔認識(事前に用意されたHaar分類器を使用) face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5) # 顔の部分に枠を描く for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 画像表示(Matplotlib使用) plt.figure(figsize=(12, 4)) plt.subplot(1, 3, 1) plt.title("Original") plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.axis('off') plt.subplot(1, 3, 2) plt.title("Gray") plt.imshow(gray, cmap='gray') plt.axis('off') plt.subplot(1, 3, 3) plt.title("Edges") plt.imshow(edges, cmap='gray') plt.axis('off') plt.tight_layout() plt.show()
実行結果
実行すると、3つの画像が横並びで表示されます:
- 左:元画像(顔が枠で囲まれている)
- 中:グレースケール画像
- 右:エッジ検出画像(輪郭が白く強調)
コード解説
cv2.imread()
: 画像を読み込みます(BGR形式)cv2.cvtColor()
: カラー→グレースケール変換cv2.Canny()
: エッジ検出(輪郭を強調)cv2.CascadeClassifier
: OpenCVに付属する顔認識用の分類器matplotlib.pyplot
: 画像を見やすく表示
for文の構造解説:
x: 顔の左上のx座標
y: 顔の左上のy座標
w: 顔の幅(width)
h: 顔の高さ(height)
注意点
sample.jpg
が見つからないとエラーになるので、パスを正しく指定しましょう- Haar分類器は顔の向きや明るさによって精度が変わるため、完璧ではありません
cv2.imshow()
ではなくmatplotlib
を使う理由は、Jupyter Notebookなどで表示しやすいためです
まとめ
今回は、PythonのOpenCVを使って画像認識の基本を体験してみました!
- 画像は行列(配列)として扱う
- NumPyで効率的に処理できる
- Matplotlibで結果を“見える化”できる
- Haar分類器を使えば、顔認識も超手軽!
OpenCVは応用範囲が広いので、次は「物体検出」や「動画処理」にもチャレンジしてみたいですね!
コメント