Pyside【第1弾 | アプリ編】OpenCVを使ったリアルタイム画像解析デモ

\ 迷ったらまずTechAcademyの無料カウンセリング! /

PythonでGUIアプリを作りたいけれど、「どんなことができるの?」と気になったことはありませんか?
今回の記事では PySide6とOpenCVを組み合わせて、リアルタイムにカメラ映像を解析しながらOK/NGを判定するデモアプリ を紹介します。

画像処理というと専門的に感じるかもしれませんが、ここでは 平均の明るさを基準に簡単な判定を行うだけ のシンプルな構成です。
それでも「リアルタイム処理 × GUI表示」の仕組みが体感できるため、学習用の題材やPoC(概念実証)にもぴったりです。

これからPySideを始めたい方、あるいは画像解析とGUIの組み合わせに興味のある方は、ぜひ最後までご覧ください。

目次

画像解析アプリの概要

この記事では PySide6 + OpenCV を使って、リアルタイムでカメラ映像を取り込み、簡単な画像解析(明るさ判定)を行うアプリを作成します。
明るさの平均値を計算し、閾値より明るければ「OK」、暗ければ「NG」と判定して表示します。

GUIアプリの構成は以下の通りです:

  1. OpenCVでカメラ映像を取得
  2. QTimerで一定間隔ごとに更新
  3. QLabelに映像を表示
  4. QLabelで判定結果を表示

完成コード

import sys
import cv2
from PySide6.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout
from PySide6.QtCore import QTimer, Qt
from PySide6.QtGui import QImage, QPixmap, QFont


class CameraApp(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("リアルタイム画像解析アプリ(明るさ判定)")
        self.setFont(QFont("Meiryo", 12))

        # --- UI ---
        self.video_label = QLabel("カメラ映像")
        self.result_label = QLabel("判定待ち...")
        self.result_label.setStyleSheet("font-size: 20pt; font-weight: bold;")
        self.result_label.setAlignment(Qt.AlignCenter)

        layout = QVBoxLayout()
        layout.addWidget(self.video_label)
        layout.addWidget(self.result_label)
        self.setLayout(layout)

        # --- カメラ設定 ---
        self.cap = cv2.VideoCapture(0)
        if not self.cap.isOpened():
            self.result_label.setText("カメラが見つかりません")
            return

        # --- タイマーで更新 ---
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_frame)
        self.timer.start(100)  # 100msごとにフレーム更新

    # 判定処理の中で切り替え
    def update_result(self, result, brightness):
        self.result_label.setText(f"判定結果: {result} (明るさ={brightness:.1f})")
        if result == "OK":
            self.result_label.setStyleSheet("""
                color: white;
                font-weight: bold;
                background-color: blue;
                font-size: 32pt;
            """)
        else:
            self.result_label.setStyleSheet("""
                color: white;
                font-weight: bold;
                background-color: red;
                font-size: 32pt;
            """)

    def update_frame(self):
        ret, frame = self.cap.read()
        if not ret:
            return

        # --- 画像解析: 明るさを計算 ---
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        brightness = gray.mean()
        result = "OK" if brightness > 100 else "NG"
        
        # --- 判定を表示 ---
        self.update_result(result, brightness)

        # --- PySide用に変換して表示 ---
        rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        h, w, ch = rgb.shape
        qimg = QImage(rgb.data, w, h, ch * w, QImage.Format_RGB888)
        self.video_label.setPixmap(QPixmap.fromImage(qimg))

    def closeEvent(self, event):
        """ウィンドウを閉じるときにカメラを解放"""
        if self.cap.isOpened():
            self.cap.release()
        super().closeEvent(event)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = CameraApp()
    win.show()
    sys.exit(app.exec())
OKNG
Webカメラで明るさが100より高いWebカメラで明るさが100以下

主なプロパティとメソッド一覧(全体解説)

Noプロパティ / メソッド説明
1cv2.VideoCapture(0)デフォルトカメラを起動し、映像を取得する
2cap.read()1フレーム分の画像を取得する
3QTimer一定時間ごとに処理を繰り返すためのタイマー
4QTimer.timeout.connect()タイマーが発火したときに処理を実行するスロットを設定
5QLabel.setPixmap()画像をGUIに表示する
6cv2.cvtColor()画像を色空間変換(BGR→RGB, グレースケールなど)
7gray.mean()グレースケール画像の平均値を計算(明るさの基準)
8QImageOpenCV画像をQt形式に変換するためのクラス
9closeEvent()ウィンドウを閉じるときの処理をカスタマイズ(カメラ解放)

各プロパティ・メソッド 詳細解説

【1】カメラを起動

概要
デフォルトカメラを起動するためのOpenCVクラス。引数に 0 を渡すと内蔵カメラ、12 を指定すると外部カメラが選択できる。

メソッド

  • isOpened() : カメラが正常に起動しているか確認

使い方

cap = cv2.VideoCapture(1)
if not cap.isOpened():
    print("カメラが見つかりません")

【2】カメラの画像を取得

概要
カメラから1フレームを取得する。戻り値は (ret, frame) のタプル。

メソッド

  • ret : 取得成功なら True
  • frame : 取得した画像(NumPy配列)

使い方

ret, frame = cap.read()
if ret:
    # frame を使った処理

【3】QTimerによるタイマー

概要
一定間隔で処理を実行できるPySideのタイマー。

使い方

self.timer = QTimer(self)
self.timer.start(30)  # 30msごと

【4】タイマーごとに関数呼び出し

概要
タイマーが発火するたびに呼ばれる関数を指定する。

使い方

self.timer.timeout.connect(self.update_frame)

【5】画像をウィジェットに表示

概要
画像をウィジェットに表示する。QPixmap を渡す必要がある。

使い方

self.video_label.setPixmap(QPixmap.fromImage(qimg))

【6】BGRをRGBに色変換

概要
色空間変換を行う。BGRをRGBに変換して表示、BGRをグレースケールに変換して解析などに使う。

使い方

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

【7】平均輝度の計算

概要
グレースケール画像の平均輝度を計算する。明るさ判定の基準に使える。

使い方

brightness = gray.mean()
result = "OK" if brightness > 100 else "NG"

【8】OpenCV画像の形式変換

概要
OpenCV画像(NumPy配列)をPySideで扱える形式に変換するクラス。

使い方

h, w, ch = rgb.shape
qimg = QImage(rgb.data, w, h, ch * w, QImage.Format_RGB888)

【9】ウィンドウを閉じる

概要
ウィンドウを閉じるときに呼ばれるイベント。ここでカメラを解放する。

使い方

def closeEvent(self, event):
    if self.cap.isOpened():
        self.cap.release()
    super().closeEvent(event)

よくある質問 FAQ

明るさの閾値(100)はどうやって決める?

環境光に依存するため、実際のカメラ映像を確認しながら調整してください。

カメラが複数ある場合は?

cv2.VideoCapture(1) のように番号を変更します。

フレームレートを変更したい

self.timer.start(30) の数値を変更。小さいほど高速更新になります。

カメラが開けないときは?

他のアプリがカメラを使っていないか確認してください。USBカメラの場合はデバイス番号も要確認です。

実際の検査に応用するには?

明るさ以外に「色検出」「輪郭抽出」「物体認識」などに置き換えると実用的になります。

まとめ

今回は PySide6とOpenCVを使ったリアルタイム画像解析デモ を紹介しました。

  • OpenCVでカメラ映像を取得
  • QTimerで定期的に更新
  • QLabelに映像を表示し、明るさを基準にOK/NGを判定

という流れで、シンプルながらも実用的な仕組みを体験できたと思います。

ここまで読んでくださったあなた、本当にお疲れさまでした!
「もっと高度な解析をしてみたい」と思った方は、色検出・輪郭抽出・機械学習モデルによる判定などへステップアップするのもおすすめです。
また、PySideの基本ウィジェットやModel/View編もあわせて学ぶと、GUIアプリの幅がぐっと広がりますよ。

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次