【Raspberry Pi × OpenCV】画像内の色を自動で判別するPythonスクリプト

目次

~カメラ映像から「赤・青・緑」などの色名を自動で検出する~

Raspberry Pi と OpenCV を使うことで、カメラに映った物体の「色」を自動で判別し、画面上にその色名を表示することができます。
本記事では、そのためのPythonスクリプトと、コードの詳しい解説、さらに活用できるシーンについてご紹介します。


使用する技術と準備環境

  • Raspberry Pi 5(または4)
  • Pi Camera(CSIカメラ)+ libcamera(撮影用)
  • OpenCV(画像処理ライブラリ)
  • Python(実行環境)

実際のコード

以下のコードでは、Raspberry Pi カメラで静止画を撮影し、その画像内にある物体の色を検出して「Red」「Blue」「Green」などの色名を画面上に表示します。

import cv2
import numpy as np
import os

def detect_color(h, s, v):
    if s < 50 and v > 200:
        return "White"
    if v < 50:
        return "Black"
    if 0 <= h <= 10 or 160 <= h <= 180:
        return "Red"
    elif 35 <= h <= 85:
        return "Green"
    elif 90 <= h <= 130:
        return "Blue"
    else:
        return "Other"

while True:
    os.system("libcamera-still -n -o color.jpg --width 640 --height 480 --timeout 1")
    img = cv2.imread("color.jpg")
    if img is None:
        break

    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, (0, 50, 50), (180, 255, 255))
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for cnt in contours:
        if cv2.contourArea(cnt) > 500:
            x, y, w, h = cv2.boundingRect(cnt)
            roi = hsv[y:y+h, x:x+w]
            h_mean = int(np.mean(roi[:, :, 0]))
            s_mean = int(np.mean(roi[:, :, 1]))
            v_mean = int(np.mean(roi[:, :, 2]))
            color_name = detect_color(h_mean, s_mean, v_mean)

            cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
            cv2.putText(img, color_name, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)

    cv2.imshow("Color Detection", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

コードの仕組み(分かりやすく解説)

処理内容詳細
libcamera-stillPiカメラで静止画を撮影します(非表示で撮影)
cv2.imread撮影した画像ファイルを読み込みます
cv2.cvtColor(..., COLOR_BGR2HSV)色空間をHSVに変換し、色の分析をしやすくします
cv2.inRange有効な色領域だけを抽出するためのマスクを作成します
cv2.findContours色領域の輪郭(境界)を見つけます
np.mean()各領域の平均色を計算し、色の特定に利用します
detect_color()HSV値から「Red」「Green」などの色名を判定します
cv2.putText()色名を画像に重ねて表示します

実際にできること・活用例

このコードを使うことで、以下のような用途に応用できます。

  • 色別仕分けロボットの試作
    • 赤、青、緑のラベルを貼った物体を自動分類
  • 教育用途
    • 小学生や中学生のプログラミング学習用に「色判定」の例として使える
  • 画像認識の前段処理
    • 色をトリガーにした検出条件の分岐処理などに利用可能

注意点と補足

  • 判定される色の種類は「赤・緑・青・白・黒・その他」に限定されていますが、検出範囲を変更すれば他の色にも対応できます。
  • 色判定の精度は、照明条件やカメラの特性に影響を受けやすいため、適宜しきい値(HSV範囲)を調整する必要があります。
  • libcamera-still を使っているため、連続撮影でも1枚ずつ画像保存→読み込みの流れになります(リアルタイムストリームではありません)。

おわりに

本記事では、Raspberry Pi + OpenCV を用いて「画像内の物体が何色かを自動判別し、表示する方法」を紹介しました。色ベースの画像処理は、シンプルながら多くの応用が可能な技術です。

今後、色判定に加えて形状・大きさ・動きなどを組み合わせれば、より高度な物体認識へと発展させることもできます。ぜひ、自由なアイデアで応用してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次