はじめに
こんにちは、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は応用範囲が広いので、次は「物体検出」や「動画処理」にもチャレンジしてみたいですね!



コメント