2022年4月28日木曜日

PySimpleGUIとOpenCVでwebカメラの映像上にマーカーを描画する

PySimpleGUIとOpenCVでwebカメラの映像上にマーカーを描画するには、以下のサンプルプログラムのようにdrawMarker関数を使用します。
マーカーには以下のような種類をmarkerTypeパラメータで指定できます
・MARKER_CROSS : 十字形
・MARKER_TILTED_CROSS : 45度傾いた十字
・MARKER_STAR : 十字と45度傾いた十字を重ね合わせた形
・MARKER_DIAMOND : ダイヤモンド形
・MARKER_SQUARE : 四角
・MARKER_TRIANGLE_UP : 上向き三角
・MARKER_TRIANGLE_DOWN : 下向き三角
また、サンプルではスライダーでmarkerSizeのサイズを調整できます。

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

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

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


sg.theme('SystemDefault')
layout = [
  [
    sg.Radio(key = 'MARKER_CROSS', text='MARKER_CROSS', group_id='f', default=True),
    sg.Radio(key = 'MARKER_TILTED_CROSS', text='MARKER_TILTED_CROSS', group_id='f'),
    sg.Radio(key = 'MARKER_STAR', text='MARKER_STAR', group_id='f'),
    sg.Radio(key = 'MARKER_DIAMOND', text='MARKER_DIAMOND', group_id='f'),
    sg.Radio(key = 'MARKER_SQUARE', text='MARKER_SQUARE', group_id='f'),
    sg.Radio(key = 'MARKER_TRIANGLE_UP', text='MARKER_TRIANGLE_UP', group_id='f'),
    sg.Radio(key = 'MARKER_TRIANGLE_DOWN', text='MARKER_TRIANGLE_DOWN', group_id='f')
  ],
  [
    sg.Text("markerSize"),
    sg.Slider(key='markerSize', range=(0, 100), resolution=1, default_value=20, orientation='horizontal', expand_x=True)
  ],
  [sg.Image(key='img1')]
]

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

# webカメラの解像度から画面中心の位置
cx = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)/2)
cy = 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:
    markerType = cv2.MARKER_CROSS
    if values is not None and values["MARKER_TILTED_CROSS"] == True:
      markerType = cv2.MARKER_TILTED_CROSS
    if values is not None and values["MARKER_STAR"] == True:
      markerType = cv2.MARKER_STAR
    if values is not None and values["MARKER_DIAMOND"] == True:
      markerType = cv2.MARKER_DIAMOND
    if values is not None and values["MARKER_SQUARE"] == True:
      markerType = cv2.MARKER_SQUARE
    if values is not None and values["MARKER_TRIANGLE_UP"] == True:
      markerType = cv2.MARKER_TRIANGLE_UP
    if values is not None and values["MARKER_TRIANGLE_DOWN"] == True:
      markerType = cv2.MARKER_TRIANGLE_DOWN
    mi = cv2.drawMarker(frame, (cx, cy), color=(0, 0, 255), 
      markerType=markerType, 
      markerSize=int(values['markerSize']),
      thickness=3
    )

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

capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

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

0 件のコメント:

コメントを投稿