2022年5月9日月曜日

PySimpleGUIとOpenCVでwebカメラ画像をK-Means法で減色する

PySimpleGUIとOpenCVでwebカメラ画像をK-Means法で減色するには、以下の順序で処理します。
1. 画像をピクセルの配列にリサイズし、float32に変換
2. K-Means法で減色された色と、減色された色のラベル値の配列を取得
3. 減色された色をuint8に変換
4. ラベル値の配列を、減色された色の配列に変換
5. 4で変換されたピクセルを画像サイズに合わせた配列に変換

サンプルコードの実行手順

1. PySimpleGUIとOpenCVがインストールされた環境の構築
以下のページを参照して、環境を構築します。
PySimpleGUIとOpenCVをインストールしてwebカメラの映像をウインドウを表示する

2. サンプルプログラムの作成と実行
以下のファイルを保存して、実行します。
psgui_opencv_kmean.py
import PySimpleGUI as sg
import cv2
import numpy as np

sg.theme('SystemDefault')
layout = [
  [sg.Image(key='img1'), sg.Image(key='img2')]
]

# webカメラをキャプチャー
capture = cv2.VideoCapture(0)

# webカメラの解像度を取得
width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)/2)
height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)/2)
window = sg.Window("webカメラ画面", layout=layout, finalize=True)
# イベントループ
while True:
  event, values = window.read(timeout=50)
  if event == sg.WIN_CLOSED:
    break
  rv, frame = capture.read()
  if rv is True:
    # 左右に並べるために縦横のサイズを半分にリサイズ
    resized = cv2.resize(frame, (width, height))
    # ピクセルの配列を取得
    colors = resized.reshape((-1,3)).astype("float32")

    # 条件: 
    # cv2.TERM_CRITERIA_EPS -> 指定された精度(epsilon)まで計算
    # cv2.TERM_CRITERIA_MAX_ITER -> 指定された回数まで計算
    max_count=10
    epsilon=1.0
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, max_count, epsilon)
    # クラスタ数
    num_of_clusters = 8
    attempts = 10
    flags = cv2.KMEANS_RANDOM_CENTERS
    # kmeans法でクラスタリング
    retval, best_labels, reduced_colors=cv2.kmeans(colors, num_of_clusters, None, criteria, attempts ,flags)
    # 減色された色をuint8に変換
    reduced_colors2 = reduced_colors.astype("uint8")
    # best_labelsを減色された色を使用する1次配列に変換
    ria = reduced_colors2[best_labels.flatten()]
    # resizedの大きさに配列を変更
    ki = ria.reshape((resized.shape))

    # pngに変換して、Image更新
    img = cv2.imencode('.png', resized)[1].tobytes()
    img2 = cv2.imencode('.png', ki)[1].tobytes()
    window['img1'].update(data=img)
    window['img2'].update(data=img2)


capture.release()
window.close()

・実行方法
以下のコマンドを実行します。
python3 psgui_opencv_kmean.py

関連情報

PySimpleGUIで画像を表示する

・OpenCVに関する他の記事はこちらを参照してください。

0 件のコメント:

コメントを投稿