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日火曜日

OSやハードウェア情報など様々な情報を取得することができるHARDINFOをUbuntu 22.04インストールする

HARDINFOでOSやハードウェア情報などの様々な情報を取得することが出来ます。

〇HARDINFOの画面(Ubuntu 22.04)

Ubuntu Softwareによるインストール方法

1. Ubuntu Softwareを起動して、hardinfoを検索します。System Profiler and Benchmarkというソフトウェアが結果に表示されます。

2.System Profiler and Benchmarkのインストールボタンをクリックします

コマンドによるインストール方法

以下のコマンドを実行してHARDINFOをインストールします。
sudo apt-get update

sudo apt-get -y install hardinfo

関連情報

・hardinfoのgithubリポジトリ
https://github.com/lpereira/hardinfo

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日月曜日

OpenShotで動画がブレた効果を付ける

OpenShotで動画がブレた効果を付けるには、以下の手順を実行します。

1. 動画クリップを2つのトラックに開始時間をずらして配置します。

2. 上位トラックの「アルファ」を0.5に設定して、下位のトラックが透けて見えるようにします。

3. ハサミアイコンの「カミソリツール」で、トラックで重ならない場所をカットします。

4. 切り取って破棄したいクリップ上で右クリックメニューから「クリップを削除」ではみ出た部分を消します。

5. 動きがあるフレームで、時間差の動画が合成されてブレのような効果を作成することが出来ます。

関連情報

OpenShot Video Editorのまとめ

・OpenShot Video Editorのプロジェクトサイト
https://www.openshot.org/ja/

・様々な動画に関するアプリケーションについては、以下のまとめを参照してください。
動画関連アプリケーションのまとめ

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日日曜日

OpenShotで動画をグレースケール(モノクローム)に変換する

OpenShotで、動画の彩度を変更するには、以下の手順を実行します。

1. エフェクトから「彩度」をドラッグアンドドロップで適用したいクリップに移動させます。

2. プロパティから「彩度」を選択して、「彩度」パラメータに0.0を設定します。

関連情報

OpenShot Video Editorのまとめ

・OpenShot Video Editorのプロジェクトサイト
https://www.openshot.org/ja/

・様々な動画に関するアプリケーションについては、以下のまとめを参照してください。
動画関連アプリケーションのまとめ

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