2022年4月19日火曜日

PySimpleGUIとOpenCVでwebカメラ画像の色相をシフトする

PySimpleGUIとOpenCVでwebカメラ画像の色相をシフトするには、以下の手順を実行します。
1. キャプチャしたBGRをHSVに変換
2. Hue/Saturation/Valueの各チャネルに分割
3. Hueチャネルの値をシフトします。180の剰余で0-179の範囲になるようにします。
4. 処理後のHueとSaturation/Valueのチャネルを結合してHSVにする
5. 処理後のHSVを再びBGRに変換

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

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

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

sg.theme('SystemDefault')
layout = [
  [
    sg.Text("hue"),
    sg.Slider(key='hue', range=(0, 179), default_value=60, orientation='horizontal', expand_x=True)
  ],
  [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))
    # hsvに変換
    hsv = cv2.cvtColor(resized, cv2.COLOR_BGR2HSV).astype("float32")
    # 各チャネルに分割
    h, s, v = cv2.split(hsv)
    # hueをスライダ値の分だけシフト
    h2 = np.mod(h + values['hue'], 180)
    # 各チャネルを結合
    hsv2 = cv2.merge([h2, s, v]).astype("uint8")
    # BGRに変換
    bgr = cv2.cvtColor(hsv2, cv2.COLOR_HSV2BGR)
    # pngに変換して、Image更新
    img = cv2.imencode('.png', resized)[1].tobytes()
    img2 = cv2.imencode('.png', bgr)[1].tobytes()
    window['img1'].update(data=img)
    window['img2'].update(data=img2)


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

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

0 件のコメント:

コメントを投稿