2022年5月4日水曜日

PySimpleGUIとOpenCVでwebカメラ画像をB/G/Rチャネルに分けて表示する

PySimpleGUIとOpenCVでwebカメラ画像をB/G/Rチャネルに分けて表示するには、以下の手順を実行します。
1. 無色(=黒色)のプレーンを作成します。
2. キャプチャした画像をsplit関数を使用してB/G/Rプレーンに分けます。
3. 無色プレーンとB/G/Rプレーンを組み合わせて、Bプレーンのみの画像、Gプレーンのみの画像、Rプレーンのみの画像を作成します。

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

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

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

sg.theme('SystemDefault')
layout = [
  [sg.Image(key='img1')],
  [sg.Image(key='img_b'), sg.Image(key='img_g'), sg.Image(key='img_r')]
]

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

# webカメラの解像度を取得
width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)/3)
height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)/3)
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:
    # 無色プレーンを作成
    size = np.array([height, width, 1])
    ep = np.full(size, (0), dtype=np.uint8)
    # 並べるために縦横のサイズを1/3にリサイズ
    resized = cv2.resize(frame, (width, height))
    # 3つのプレーンに分解
    bp, gp, rp = cv2.split(resized)
    # Blue用イメージ作成
    bi = cv2.merge((bp, ep, ep))
    # Green用イメージ作成
    gi = cv2.merge((ep, gp, ep))
    # Red用イメージ作成
    ri = cv2.merge((ep, ep, rp))

    # pngに変換してImage更新
    img = cv2.imencode('.png', frame)[1].tobytes()
    img_b = cv2.imencode('.png', bi)[1].tobytes()
    img_g = cv2.imencode('.png', gi)[1].tobytes()
    img_r = cv2.imencode('.png', ri)[1].tobytes()
    window['img1'].update(data=img)
    window['img_b'].update(data=img_b)
    window['img_g'].update(data=img_g)
    window['img_r'].update(data=img_r)


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

0 件のコメント:

コメントを投稿