2022年4月17日日曜日

PySimpleGUIとOpenCVでwebカメラの映像を左右反転・上下反転させる

PySimpleGUIとOpenCVでwebカメラの映像を左右反転・上下反転させるには、以下のサンプルプログラムのようにflip関数を使用します。
flip関数のflipCode引数には、以下を指定します。
・0: X軸反転→上下反転
・1: Y軸反転→左右反転
・-1: 上下・左右反転

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

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

2. サンプルプログラムの作成と実行
以下のファイルを保存して、実行します。ラジオボタンをクリックすると回転角度が変化します。
psgui_opencv_flip.py
import PySimpleGUI as sg
import cv2


sg.theme('SystemDefault')
layout = [
  [
    sg.Radio(key = 'noflip', text='なし', group_id='f', default=True),
    sg.Radio(key = 'y-flip', text='左右反転', group_id='f'),
    sg.Radio(key = 'x-flip', text='上下反転', group_id='f'),
    sg.Radio(key = 'xy-flip', text='左右上下反転', group_id='f')
  ],
  [sg.Image(key='img1')]
]

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

# ウインドウのタイトルバーに解像度を表示
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:
    flipped = frame
    if values is not None and values['x-flip'] == True:
      flipped = cv2.flip(frame, flipCode=0)
    if values is not None and values['y-flip'] == True:
      flipped = cv2.flip(frame, flipCode=1)
    if values is not None and values['xy-flip'] == True:
      flipped = cv2.flip(frame, flipCode=-1)
    # pngに変換してImage更新
    img = cv2.imencode('.png', flipped)[1].tobytes()
    window['img1'].update(data=img)

capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

PySimpleGUIでラジオボタン要素の初期選択状態を設定する

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

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

0 件のコメント:

コメントを投稿