プログラミングの芽

面白そうな技術を使って、楽しいことやりたい

ウェブカメラ映像内の色をリアルタイムでヒストグラム表示

メモ

# OpenCV のインポート
import cv2
import numpy as np
import matplotlib.pyplot as plt
from collections import Counter

# VideoCaptureのインスタンスを作成する。
# 引数でカメラ選択
cap = cv2.VideoCapture(0)

while True:
    # VideoCaptureから1フレーム読み込む
    ret, frame = cap.read()
    #HSVに変換
    f_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    #画像のサイズと検出した色を格納する配列を用意
    height = f_hsv.shape[0]
    width = f_hsv.shape[1]
    pixels = []
    
    #各ピクセルで閾値を満たしたらpixels[]に格納する
    for y in range(height):
        for x in range(width):
            if (f_hsv[y, x, 1] > 45 and 32 < f_hsv[y, x, 2]):
                pixels.append(f_hsv[y, x, 0])
    
    #12分割して色を判断(ヒストグラムの出力)
    plt.xlim(0,180) # x軸の範囲
    plt.xticks(np.arange(0, 180 + 1, 15)) # x軸の目盛りの設定
    plt.hist(pixels, bins=12, range=(0,180)) # ヒストグラムの出力 
    plt.pause(.001)
    
    #最頻値を求めてその画像の色を判断
    # 軸の作成 (0から180を13等分[12個の区間を出したいため]) 
    bins = np.linspace(0, 180, 13)  
    # pixelsをそれぞれの要素を12分割した色範囲に格納  
    index = np.digitize(pixels,bins) 
    # 最頻値
    c = Counter(index)
    print(c)
    mode = c.most_common(1)
    # 最頻値の出力
    print(mode[0][0])
    
    #カメラ映像の出力
    cv2.imshow('Raw Frame', frame)

    # キー入力を1ms待って、k が27(ESC)だったらBreakする
    k = cv2.waitKey(1)
    if k == 27:
        break

# キャプチャをリリースして、ウィンドウをすべて閉じる
cap.release()
cv2.destroyAllWindows()


実行結果(GIF)
https://i.gyazo.com/82895dd2da06638a5be0d1fc7f5a9f7c.gif