2022年5月3日火曜日

PySimpleGUIとOpenCVでwebカメラ画像を選択した色で着色する

PySimpleGUIとOpenCVでwebカメラ画像を選択した色で着色するには、以下の手順を実行します。
1. カラーコードからBGRのタプルに変換して、単色画像を作成
2. webカメラの画像と単色画像をaddWeighted関数を使用して重ね合わせる

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

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

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

sg.theme('SystemDefault')
layout = [
  # 着色用カラーコード
  [sg.Text("Color"), sg.Input(key='color', default_text='#88000'), sg.ColorChooserButton('ColorButton', target='color')],
  # ブレンディング比率
  [sg.Text("Percent"), sg.Slider(key='percent', range=(0, 100), default_value=50, orientation='horizontal')],
  [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)
  #print(event, values)
  if event == sg.WIN_CLOSED:
    break
  rv, frame = capture.read()
  if rv is True:
    color_hex = values['color'].lstrip('#')
    if color_hex != '':
      bgr = tuple(int(color_hex[i:i+2], 16) for i in (4, 2, 0))
      # 単色画像を作成
      size = np.array([height, width, 3])
      ci = np.full(size, bgr, dtype=np.uint8)
      # 左右に並べるために縦横のサイズを半分にリサイズ
      resized = cv2.resize(frame, (width, height))
      # 重ね合わせ
      tint = cv2.addWeighted(resized, 1-(values['percent']/100), ci, values['percent']/100, 0)

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

capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

0 件のコメント:

コメントを投稿