目次
~カメラ映像から「赤・青・緑」などの色名を自動で検出する~
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-still | Piカメラで静止画を撮影します(非表示で撮影) |
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 を用いて「画像内の物体が何色かを自動判別し、表示する方法」を紹介しました。色ベースの画像処理は、シンプルながら多くの応用が可能な技術です。
今後、色判定に加えて形状・大きさ・動きなどを組み合わせれば、より高度な物体認識へと発展させることもできます。ぜひ、自由なアイデアで応用してみてください。