えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

Qtでimshowを代用する(PySide2)

実は最近Qtをさわってます。

数年前にQtを使ってアプリケーションを作っていて、最終的に便利なジェネレーションパッケージとして「PyamlQt」を作成しました。

割と便利だったのですが、GUIに時間を割くことができず中途半端に終わっています。

github.com

1年前はたしかReactつかってGUI作りてえなぁと思ったり、flutter(dart)使ったり、htmlベースでGUI使ったりと綺麗なグラフィックをもとめてチョット勉強したりしていた気がします。

結局、慣れるまで大変すぎるのと、私が開発したいのはC++/Pythonアプリケーションであることがあり挫折。

最近までは、Rvizにパネル出してごまかしもしていました。

つまり、よわよわ駆け出しエンジニアです‥😇


いまさらですが、QLabelで画像を描画できるらしいと知ったので、(紹介も兼ねて)imshowの代わりにPyside2(Python版Qt)を使ってGUIカスタムしてみようと思います。


使用環境

はやくUbuntu24に乗りかえなければ‥

(python depends)


PyamlSide2の使いかた

そもそも、PyamlSide2とは2022年の技育展に出すことと、さくっとGUIを作成して研究に使うデモアプリをさくっと終わらせる2つの目的がありました。

インストールは次の通り。READMEちゃんと書いていた自分に感謝。

git clone https://github.com/Ar-Ray-code/ReadableWidgets.git

cd ReadableWidgets/PySide2/
pip install .

READMEを読むと、どうやらYAMLファイルからPySide2ランタイムを自動生成してくれるらしい。

とりあえずYAMLファイルを適当に作成します。

WINDOW:
  type: window
  x: 0
  y: 0
  width: 1280
  height: 729
  title: "camera demo"
style_common:
  type: stylesheet
  style:
    include:
      path: https://raw.githubusercontent.com/Ar-Ray-code/PyamlQt/main/yaml/color/style_blue.yaml
      key: style_common
button_1:
  type: qpushbutton
  rect:
    include:
      path: https://raw.githubusercontent.com/Ar-Ray-code/PyamlQt/main/yaml/rect/basic_button.yaml
      key: basic_button
  x_center: 100
  y_center: 360
  text: "PUSH"
vcodec_label:
  type: qlabel
  x_center: 640
  y_center: 360
  rect:
    width: 640
    height: 360
  text: ""
  style:
    font: 10px
    color: white
    font-family: Ubuntu

生成します。

rw_gen_yaml2py -i yaml/video_demo.yaml -o video_demo.py

video_demo.py というファイルが生成されました。

これと、生成に使用したYAMLファイルを引数に実行

python3 video_demo.py video_demo.yaml

はい、GUI完成!

え、、2年前の自分天才なのでは!?(自画自賛


ビデオフレームを埋め込む

ということで、OpenCVでビデオ取得しましょう。

これでOK! QTimerはQTで使えるTImerです。


opencv-python GUI抜きが必要

実行しようとすると次のエラーが‥

どうやらOpenCVGUI機能が衝突しているみたいです💥

アンインストールして opencv-python-headless をインストールします。

pip3 uninstall opencv-python
pip3 install opencv-python-headless

実行するとウェブカメラ映像が垂れ流されて「PUSH」ボタンで一時停止可能なウィンドウが開きます。

完璧です!

コードはこちらにあります↓

demo_camera.py · GitHub

C++向けに実装したいなぁと一瞬思いましたが、面倒だったことを思い出しました😇

そういえば、今はChatGPTというものがありますね()