ラベル PySimpleGUI の投稿を表示しています。 すべての投稿を表示
ラベル PySimpleGUI の投稿を表示しています。 すべての投稿を表示

2022年9月5日月曜日

Raspberry Pi OS(Raspbian Bullseye)にPySimpleGUIとOpenCVをインストールしてwebカメラの映像をウインドウに表示する

PySimpleGUIとOpenCVをインストールしてwebカメラの映像をウインドウに表示するには、以下の手順を実行します。webカメラはUSBカメラのものを使用します。

実行手順

1.pipenvのインストール
pipenvをインストール済みでない場合は、以下のコマンドでインストールします。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade setuptools

pip3 install --user pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc

source ~/.bashrc

2. PySimpleGUIとOpenCVをインストールした仮想環境の作成
mkdir -p ./psgui-opencv

cd ./psgui-opencv

pipenv --python 3

pipenv install pysimplegui

pipenv install numpy

pipenv install opencv-python

pipenv install opencv-contrib-python

pipenv shell

サンプル実行手順

以下のファイルを保存して、実行します。
psgui_opencv.py
mport PySimpleGUI as sg
import cv2

sg.theme('SystemDefault')
layout = [
  [sg.Image(key='img1')]
]

# webカメラをキャプチャー
capture = cv2.VideoCapture(0)
window = sg.Window("webカメラ画面", layout=layout, finalize=True)
# イベントループ
while True:
  rv, frame = capture.read()
  if rv is True:
    # キャプチャーした画像をpngに変換
    img = cv2.imencode('.png', frame)[1].tobytes()
    # Imageの内容を更新
    window['img1'].update(data=img)

  event, values = window.read(timeout=0)
  if event == sg.WIN_CLOSED:
    break

capture.release()
window.close()

〇実行コマンド
python3 psgui_opencv.py

〇実行結果
webカメラの内容がウインドウに表示されます。

〇動作環境
Raspberry Pi OS (Raspbian Bullseye)

関連情報

Raspberry Pi OS(Raspbian Bullseye)にPySimpleGUIをインストールして、簡単なウインドウを表示する

2022年8月26日金曜日

Raspberry Pi OS(Raspbian Bullseye)にPySimpleGUIをインストールして、簡単なウインドウを表示する

PySimpleGUIでGUIを簡単に作成する事が出来ます。

インストール方法

1.pipenvのインストール
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade setuptools

pip3 install --user pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc

source ~/.bashrc

2. PySimpleGUI用の仮想環境作成
pipenvを使用する場合は以下のコマンドで、PySimpleGUI用の仮想環境を作成します。
sudo apt-get -y install python3-tk tk-dev

mkdir -p ~/pysimplegui

cd ~/pysimplegui

pipenv --python 3

pipenv install PySimpleGUI

pipenv shell

サンプル実行手順

以下のファイルを保存して、実行します。
sample1.py
import PySimpleGUI as sg

sg.theme('SystemDefault')
layout = [[sg.Text('サンプルです')]]

window = sg.Window('サンプル', layout)
# イベントループ
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

window.close()

実行コマンド
python sample1.py

〇実行結果
以下の小さなウインドウが表示されます。

2022年7月25日月曜日

Ubuntu 22.04にPySimpleGUIをインストールして、簡単なウインドウを表示する

PySimpleGUIでGUIを簡単に作成する事が出来ます。

インストール方法

1.pipenvのインストール
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

python3 -m pip install --user pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.profile

echo 'export PATH=$PATH:/home/ubuntu/.local/bin' >> ~/.profile

source ~/.profile

2. PySimpleGUI用の仮想環境作成
pipenvを使用する場合は以下のコマンドで、PySimpleGUI用の仮想環境を作成します。
sudo apt-get -y install python3-tk tk-dev

mkdir -p ~/pysimplegui

cd ~/pysimplegui

pipenv --python 3

pipenv install PySimpleGUI

pipenv shell

サンプル実行手順

以下のファイルを保存して、実行します。
simple_window.py
import PySimpleGUI as sg

sg.theme('SystemDefault')
layout = [[sg.Text('サンプルです')]]

window = sg.Window('サンプル', layout)
# イベントループ
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

window.close()

実行コマンド
python simple_window.py

〇実行結果
以下の小さなウインドウが表示されます。

2022年5月11日水曜日

PySimpleGUIとOpenCVでwebカメラ画像をピクセル化する

PySimpleGUIとOpenCVでwebカメラ画像をピクセル化するには、interpolation=cv2.INTER_LINEARを指定してresize関数を使用して縮小した後、interpolation=cv2.INTER_NEARESTを指定してresize関数を使用して元の大きさに戻します。

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

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

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

sg.theme('SystemDefault')
layout = [
  [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))

    # ピクセルのサイズ
    pixel_size=16
    tpi = cv2.resize(resized, (int(width/pixel_size), int(height/pixel_size)), interpolation=cv2.INTER_LINEAR)
    pi = cv2.resize(tpi, (width, height), interpolation=cv2.INTER_NEAREST)

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


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年5月10日火曜日

PySimpleGUIとOpenCVでwebカメラ画像をUnifrom Quantizationで減色する

PySimpleGUIとOpenCVでwebカメラ画像をUnifrom Quantizationで減色するには、np.round(ピクセル値*(N/255))*(255/N)の式を使用します。

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

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

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

sg.theme('SystemDefault')
layout = [
  [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))

    # Uniform Quantizationで減色
    N = 2 # -> 8colors
    N = 4 # -> 64colors
    #N = 8 # -> 512colors
    qi = np.round(resized*(N/255))*(255/N)

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


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年5月9日月曜日

PySimpleGUIとOpenCVでwebカメラ画像をK-Means法で減色する

PySimpleGUIとOpenCVでwebカメラ画像をK-Means法で減色するには、以下の順序で処理します。
1. 画像をピクセルの配列にリサイズし、float32に変換
2. K-Means法で減色された色と、減色された色のラベル値の配列を取得
3. 減色された色をuint8に変換
4. ラベル値の配列を、減色された色の配列に変換
5. 4で変換されたピクセルを画像サイズに合わせた配列に変換

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

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

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

sg.theme('SystemDefault')
layout = [
  [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))
    # ピクセルの配列を取得
    colors = resized.reshape((-1,3)).astype("float32")

    # 条件: 
    # cv2.TERM_CRITERIA_EPS -> 指定された精度(epsilon)まで計算
    # cv2.TERM_CRITERIA_MAX_ITER -> 指定された回数まで計算
    max_count=10
    epsilon=1.0
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, max_count, epsilon)
    # クラスタ数
    num_of_clusters = 8
    attempts = 10
    flags = cv2.KMEANS_RANDOM_CENTERS
    # kmeans法でクラスタリング
    retval, best_labels, reduced_colors=cv2.kmeans(colors, num_of_clusters, None, criteria, attempts ,flags)
    # 減色された色をuint8に変換
    reduced_colors2 = reduced_colors.astype("uint8")
    # best_labelsを減色された色を使用する1次配列に変換
    ria = reduced_colors2[best_labels.flatten()]
    # resizedの大きさに配列を変更
    ki = ria.reshape((resized.shape))

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


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年5月8日日曜日

PySimpleGUIとOpenCVでwebカメラ画像をmedianBlur関数でぼかして表示する

webカメラ画像をOpenCVのmedianBlur関数でぼかすことができます。medianBlur関数の引数には以下を指定します。
・元画像
・ksize : カーネルサイズ。奇数かつ正の値を指定します。

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

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

2. サンプルプログラムの作成と実行
以下のファイルを保存して、実行します。ksizeはスライダーによって変更できます。
psgui_opencv_median.py
import PySimpleGUI as sg
import cv2


sg.theme('SystemDefault')
layout = [
  [
    sg.Text("ksize"),
    sg.Slider(key='ksize', range=(1, 51), resolution=2, default_value=5, 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))
    # medianBlur関数でぼかす
    ksize = int(values['ksize'])
    bi = cv2.medianBlur(resized, ksize=ksize)
    # pngに変換して、Image更新
    img = cv2.imencode('.png', resized)[1].tobytes()
    img2 = cv2.imencode('.png', bi)[1].tobytes()
    window['img1'].update(data=img)
    window['img2'].update(data=img2)


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年5月7日土曜日

PySimpleGUIとOpenCVでwebカメラ画像の上下左右を切り落とす

PySimpleGUIとOpenCVでwebカメラ画像の上下左右を切り落とすには、以下のサンプルプログラムのようにimage[y1:y2, x1:x2]というようにイメージの一部分を取り出します(x1:X座標左,y1:Y座標上,x2:X座標右,y2:Y座標下)。

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

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

2. サンプルプログラムの作成と実行
以下のファイルを保存して、実行します。ksizeはスライダーによって変更できます。
psgui_opencv_crop.py
import PySimpleGUI as sg
import cv2


sg.theme('SystemDefault')
layout = [
  [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))
    # 上下左右10%を切り落とす
    ci = resized[int(height/10):int(height/10*9), int(width/10):int(width/10*9)]
    # pngに変換して、Image更新
    img = cv2.imencode('.png', resized)[1].tobytes()
    img2 = cv2.imencode('.png', ci)[1].tobytes()
    window['img1'].update(data=img)
    window['img2'].update(data=img2)


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年5月6日金曜日

PySimpleGUIとOpenCVでwebカメラ画像をblur関数でぼかして表示する

PySimpleGUIとOpenCVでwebカメラ画像をblur関数でぼかして表示するには、以下のサンプルプログラムを参照してください。
blurの引数には以下を指定します。
・元画像
・ksize : カーネルサイズ。奇数かつ正の値を指定します。

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

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

2. サンプルプログラムの作成と実行
以下のファイルを保存して、実行します。ksizeはスライダーによって変更できます。
psgui_opencv_blur.py
import PySimpleGUI as sg
import cv2


sg.theme('SystemDefault')
layout = [
  [
    sg.Text("ksize"),
    sg.Slider(key='ksize', range=(1, 51), resolution=2, default_value=5, 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))
    # blur関数でぼかす
    ksize = int(values['ksize'])
    bi = cv2.blur(resized, ksize=(ksize, ksize))
    # pngに変換して、Image更新
    img = cv2.imencode('.png', resized)[1].tobytes()
    img2 = cv2.imencode('.png', bi)[1].tobytes()
    window['img1'].update(data=img)
    window['img2'].update(data=img2)


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年5月5日木曜日

PySimpleGUIとOpenCVでwebカメラ画像の色を反転する

PySimpleGUIとOpenCVでwebカメラ画像の色を反転するには、以下のサンプルプログラムのようにcv2.bitwise_not関数を使用します。

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

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

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

sg.theme('SystemDefault')
layout = [
  [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:
    # 左右に並べるために縦横のサイズを半分にリサイズ
    resized = cv2.resize(frame, (width, height))
    # 色を反転
    inverted = cv2.bitwise_not(resized)
    # pngに変換してImage更新
    img = cv2.imencode('.png', resized)[1].tobytes()
    img2 = cv2.imencode('.png', inverted)[1].tobytes()
    window['img1'].update(data=img)
    window['img2'].update(data=img2)

capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

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に関する他の記事はこちらを参照してください。

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に関する他の記事はこちらを参照してください。

2022年5月2日月曜日

PySimpleGUIとOpenCVでCannyアルゴリズムを使用してwebカメラ画像のエッジを抽出する

PySimpleGUIとOpenCVでCannyアルゴリズムを使用してwebカメラ画像のエッジを抽出するには、以下の手順を実行します。
1. キャプチャした画像をグレースケールに変換
2. Canny関数でエッジ抽出処理を行う。threshold1にはヒステリシスで使用する第1閾値、threshold2にはヒステリシスで使用する第2閾値を指定します。
このサンプルプログラムではthreshold1/threshold2をスライダーで調整できます。

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

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

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

sg.theme('SystemDefault')
layout = [
  [
    sg.Text('Threshold1'),
    sg.Slider(key='t1', range=(0, 255), default_value=50, orientation='horizontal', expand_x=True)
  ],
  [
    sg.Text('Threshold2'),
    sg.Slider(key='t2', range=(0, 255), default_value=100, 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))

    # グレースケールに変換
    gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
    
    # Cannyアルゴリズムでエッジ抽出
    canny = cv2.Canny(gray, int(values['t1']), int(values['t2']), apertureSize=3, L2gradient=False)
    # pngに変換して、Image更新
    img = cv2.imencode('.png', resized)[1].tobytes()
    img2 = cv2.imencode('.png', canny)[1].tobytes()
    window['img1'].update(data=img)
    window['img2'].update(data=img2)


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年5月1日日曜日

PySimpleGUIとOpenCVでwebカメラ画像中の円を検出する

OpenCVで画像中の円を検出するには、以下のサンプルプログラムのようにHoughCircles関数を使用します。

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

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

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


sg.theme('SystemDefault')
layout = [
  [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))
    # グレースケールに変換
    gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
    # HoughCirclesで円を検出
    circles = cv2.HoughCircles(
      gray, cv2.HOUGH_GRADIENT, # methodはHOUGH_GRADIENTまたはHOUGH_GRADIENT_ALT
      dp=1.0, # アキュムレーターは入力イメージと同じ解像度
      minDist=50,  # 検出された円間の最小距離
      param1=110, param2=80 # 検出方式特有のパラメータ。 param1=Canneyエッジ抽出器に渡す高い方の閾値/param2=検出ステージの円中心のアキュムレーター閾値
    )
    # 円を描画
    ci = resized.copy()
    if circles is not None:
      for idx in range(len(circles[0])):
        circle = circles[0][idx]
        ci = cv2.circle(ci, (int(circle[0]), int(circle[1])), int(circle[2]), (0, 192, 0), 2)

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


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年4月30日土曜日

PySimpleGUIとOpenCVでwebカメラ画像上に文字列を描画する

OpenCVで文字列を描画するにはputText関数を使用します。引数には以下を指定します
・描画先イメージ
・文字列
・org : 文字列の左下座標
・fontFace: FONT_HERSHEY_SIMPLEX/FONT_HERSHEY_PLAIN/FONT_HERSHEY_DUPLEX/FONT_HERSHEY_COMPLEX/FONT_HERSHEY_TRIPLEX/FONT_HERSHEY_COMPLEX_SMALL/FONT_HERSHEY_SCRIPT_SIMPLEX/FONT_HERSHEY_SCRIPT_COMPLEX/FONT_ITALIC
・fontScale:フォントの大きさの倍率
・color: 描画色
・thickness: 線の太さ

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

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

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


sg.theme('SystemDefault')
layout = [
  [sg.Image(key='img1')]
]

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

# webカメラの解像度を取得
width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
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:
    # 文字列描画
    ti = cv2.putText(frame,
      "Width: {}, Height:{}".format(width, height),
      org=(10, int(height/10)*9),
      fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,
      fontScale=1,
      color=(0, 0, 0),
      thickness=3
    )
    # pngに変換して、Image更新
    img = cv2.imencode('.png', ti)[1].tobytes()
    window['img1'].update(data=img)


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年4月29日金曜日

PySimpleGUIとOpenCVでwebカメラ画像上に不透明・半透明の楕円を描画する

OpenCVで楕円を描画するにはellipse関数を使用します。thicknessパラメータにcv2.FILLEDを指定すると塗りつぶしになります。
楕円はboxパラメータに((楕円の中心X座標, 楕円の中心Y座標), (幅, 高さ), 角度)というタプルで指定します。
半透明の円を描画するには、描画先の画像を複製して片方にのみ楕円を描画してcv2.addWeighted関数でalpha/betaパラメータを指定して重ね合わせます。

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

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

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

sg.theme('SystemDefault')
layout = [
  [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)
ac = 0
# イベントループ
while True:
  event, values = window.read(timeout=50)
  if event == sg.WIN_CLOSED:
    break
  ac = ac+1
  rv, frame = capture.read()
  if rv is True:
    # 左右に並べるために縦横のサイズを半分にリサイズ
    resized = cv2.resize(frame, (width, height))
    # 半透明描画用に複製
    semitr1 = resized.copy()
    semitr2 = resized.copy()
    # 不透明の楕円を描画
    dx = int(width/10)
    dy = int(height/10)
    cv2.ellipse(resized, ((dx*3, dy*5), (dx*5, dy*4), int(np.mod(30+ac, 360))), (255, 0, 0), 6)
    cv2.ellipse(resized, ((dx*7, dy*5), (dx*5, dy*4), int(np.mod(90+ac, 360))), (255, 0, 0), cv2.FILLED)
    # 半透明の楕円を描画
    cv2.ellipse(semitr2, ((dx*3, dy*5), (dx*5, dy*4), int(np.mod(30+ac, 360))), (255, 0, 0), 6)
    cv2.ellipse(semitr2, ((dx*7, dy*5), (dx*5, dy*4), int(np.mod(90+ac, 360))), (255, 0, 0), cv2.FILLED)
    alpha=0.5
    semitr = cv2.addWeighted(semitr2, alpha, semitr1, 1-alpha, 0)
    # pngに変換して、Image更新
    img = cv2.imencode('.png', resized)[1].tobytes()
    img2 = cv2.imencode('.png', semitr)[1].tobytes()
    window['img1'].update(data=img)
    window['img2'].update(data=img2)


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

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に関する他の記事はこちらを参照してください。

2022年4月27日水曜日

PySimpleGUIとOpenCVでwebカメラ画像の輪郭線を描画する

OpenCVで輪郭線を描画するには画像を以下の順序で処理します。
1. threshold関数などで画像を二値化します
2. findContours関数で輪郭線検出を行う
3. drawContours関数で輪郭線を描画

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

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

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

sg.theme('SystemDefault')
layout = [
  [sg.Slider(key='slider', range=(0, 255), default_value=128, 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:
    # 左右に並べるために縦横のサイズを半分にリサイズ
    resized = cv2.resize(frame, (width, height))
    # グレースケールに変換
    gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
    # 2値化
    slider = values['slider']
    threshold, binary = cv2.threshold(gray, slider, 255, cv2.THRESH_BINARY)
    # 輪郭抽出
    (contours, hierarchy) = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    # 輪郭描画
    cnt = resized.copy()
    cnt = cv2.drawContours(resized, contours, -1, (0,192,0), 2)

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

capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年4月26日火曜日

PySimpleGUIとOpenCVでwebカメラ画像上に不透明・半透明の矢印線を描画する

OpenCVで矢印線を描画するにはarrowedLine関数を使用します。半透明の矢印線を描画するには、描画先の画像を複製して片方にのみ矢印線を描画してcv2.addWeighted関数でalpha/betaパラメータを指定して重ね合わせます。
thicknessパラメータは線の太さ、tipLengthは矢印の先の長さを、矢印線の長さの相対で指定します。

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

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

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


sg.theme('SystemDefault')
layout = [
  [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))
    # 半透明描画用に複製
    semitr1 = resized.copy()
    semitr2 = resized.copy()
    # 不透明の矢印線を描画
    dx = int(width/10)
    dy = int(height/10)
    cv2.arrowedLine(resized, (dx*5, dy*5), (dx*2, dy*5), (255, 255, 255), thickness=5, tipLength=0.1)
    # 半透明の矢印線を描画
    cv2.arrowedLine(semitr2, (dx*5, dy*5), (dx*8, dy*5), (255, 255, 255), thickness=8, tipLength=0.4)
    alpha=0.5
    semitr = cv2.addWeighted(semitr2, alpha, semitr1, 1-alpha, 0)

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


capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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

2022年4月25日月曜日

PySimpleGUIとOpenCVでwebカメラ画像上に不透明・半透明の円を描画する

OpenCVで円を描画するにはcircle関数を使用します。thicknessパラメータにcv2.FILLEDを指定すると塗りつぶしになります。
半透明の円を描画するには、描画先の画像を複製して片方にのみ円を描画してcv2.addWeighted関数でalpha/betaパラメータを指定して重ね合わせます。

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

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

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


sg.theme('SystemDefault')
layout = [
  [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))
    # 半透明描画用に複製
    semitr1 = resized.copy()
    semitr2 = resized.copy()
    # 不透明の円を描画
    dx = int(width/10)
    dy = int(height/10)
    cv2.circle(resized, (dx*3, dy*5), dy*4, (255, 0, 0), 6)
    cv2.circle(resized, (dx*7, dy*5), dy*4, (255, 0, 0), cv2.FILLED)
    # 半透明の円を描画
    cv2.circle(semitr2, (dx*3, dy*5), dy*4, (255, 0, 0), 6)
    cv2.circle(semitr2, (dx*7, dy*5), dy*4, (255, 0, 0), cv2.FILLED)
    alpha=0.5
    semitr = cv2.addWeighted(semitr2, alpha, semitr1, 1-alpha, 0)
    # pngに変換して、Image更新
    img = cv2.imencode('.png', resized)[1].tobytes()
    img2 = cv2.imencode('.png', semitr)[1].tobytes()
    window['img1'].update(data=img)
    window['img2'].update(data=img2)

capture.release()
window.close()

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

関連情報

PySimpleGUIで画像を表示する

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