ふくふくHukuhuku Inc.
EP.08STEM対象: 高1以上 11分公開: 2026-05-10

画像処理:OpenCVで顔認識

自分の写真をPythonに渡して、顔の位置を検出。さらにモザイク化や絵文字置き換え、画像処理の基本を。

#中高生#OpenCV#画像処理
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

OpenCV(オープン・シー・ブイ)は、画像処理の世界で20年以上使われ続ける。Python で顔認識・モザイク化・画像加工が、たった数行で書けるようになります。今回は5つのステップで、自分の写真を遊んでみよう。

今回のゴール

① 写真を に読み込む ② 顔を自動検出する ③ 検出した顔にモザイクをかける ④ グレースケール・エッジ検出などの加工 ⑤ 自由研究へのヒント

Step 1: OpenCV を使う準備

Colab セルで実行
Python
# OpenCV は Colab に最初から入ってるimport cv2import numpy as npimport matplotlib.pyplot as pltfrom google.colab import files
# Colab に写真をアップロード(ボタンが出るので家族写真でも何でも)uploaded = files.upload()filename = list(uploaded.keys())[0]
# 読み込み(OpenCV は BGR 順なので、表示用に RGB に変換)img_bgr = cv2.imread(filename)img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(8, 6))plt.imshow(img_rgb)plt.axis("off")plt.title("元の写真")plt.show()

Step 2: 顔を検出する(Haar Cascade)

「顔だけを四角で囲む」は、Paul Viola と Michael Jones が 2001年に発明した Haar Cascade(ハール カスケード) というアルゴリズムでできます。OpenCV には学習済みモデルが付属。

顔検出して四角で囲む
Python
# OpenCV 内蔵の顔検出モデルを使うface_cascade = cv2.CascadeClassifier(    cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
# グレースケールに変換してから検出(顔検出は色情報を使わない)gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
print(f"検出された顔: {len(faces)} 個")
# 検出した顔に四角を描くimg_with_box = img_rgb.copy()for (x, y, w, h) in faces:    cv2.rectangle(img_with_box, (x, y), (x+w, y+h), (255, 0, 0), 3)
plt.figure(figsize=(8, 6))plt.imshow(img_with_box)plt.axis("off")plt.title(f"顔検出結果 ({len(faces)} 人)")plt.show()

Step 3: 顔にモザイクをかける

プライバシーが心配な写真を に上げる前に、自分でモザイクをかけられる。原理は「顔の部分を低解像度に縮めて、また拡大して戻す」だけ。

顔にモザイクをかける
Python
def mosaic(image, x, y, w, h, ratio=0.05):    """顔領域を ratio 倍に縮小→拡大してモザイクにする"""    face = image[y:y+h, x:x+w]    small = cv2.resize(face, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)    mosaic_face = cv2.resize(small, (w, h), interpolation=cv2.INTER_NEAREST)    image[y:y+h, x:x+w] = mosaic_face    return image
img_mosaic = img_rgb.copy()for (x, y, w, h) in faces:    img_mosaic = mosaic(img_mosaic, x, y, w, h, ratio=0.05)
plt.figure(figsize=(8, 6))plt.imshow(img_mosaic)plt.axis("off")plt.title("プライバシー保護版")plt.show()

Step 4: 画像処理いろいろ

グレースケール / 反転 / ぼかし / エッジ検出
Python
# 4種類の加工を一気にgray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)inverted = 255 - img_rgbblurred = cv2.GaussianBlur(img_rgb, (15, 15), 0)edges = cv2.Canny(gray, 50, 150)
fig, axes = plt.subplots(2, 2, figsize=(11, 8))axes[0, 0].imshow(gray, cmap="gray"); axes[0, 0].set_title("グレースケール"); axes[0, 0].axis("off")axes[0, 1].imshow(inverted); axes[0, 1].set_title("色反転(ネガ)"); axes[0, 1].axis("off")axes[1, 0].imshow(blurred); axes[1, 0].set_title("ぼかし(ガウシアン)"); axes[1, 0].axis("off")axes[1, 1].imshow(edges, cmap="gray"); axes[1, 1].set_title("エッジ検出(Canny)"); axes[1, 1].axis("off")plt.tight_layout()plt.show()

Step 5: 自分の名前のスタンプを画像に貼る

画像に文字を入れる
Python
img_signed = img_rgb.copy()text = "by Yamada"
# 左下にテキストh, w = img_signed.shape[:2]cv2.putText(img_signed, text, (20, h - 20),            cv2.FONT_HERSHEY_DUPLEX, 1.5, (255, 255, 255), 3)
plt.figure(figsize=(8, 6))plt.imshow(img_signed)plt.axis("off")plt.show()

自由研究のヒント

  • 目だけ検出:`haarcascade_eye.xml` を使うと目の位置が取れる。目線を黒帯で消す機能を作ろう
  • 笑顔検出:`haarcascade_smile.xml` で「笑顔のときだけ撮影するカメラ」
  • 動画への応用:1枚の画像と同じことをビデオの各フレームに適用すると、「リアルタイム顔検出」になる
  • 色の置換:「赤い服を青に変える」など、色域でフィルタしてから書き換える
  • 機械学習版:Haar Cascade は古典手法。最新は MTCNNYOLO で精度がグッと上がる

次回予告

EP.09 は自然言語処理。文章の感情分析を作ります。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp