LoginSignup
1
1

More than 1 year has passed since last update.

【VR空間サービス Spatial.io】#7 来場カウンタ

Last updated at Posted at 2023-04-02

サマリ

Spatialのスペースに来た人を認識して以下のようなログをファイルに出力します。

2023-04-03 01:07:36 - mayo32 has joined the space.

スペースに人が入ってきた時に表示されるメッセージを画像認識してログ書き出しのトリガーとします。

★以下の点未確認です。。

  • 日本語のユーザー名
  • ユーザー名に絵文字を含む場合

動作確認環境

  • Windows 11 Home 22H2
  • python 3.11.1
  • OBS studio 29.0.2
  • obs-virtualcam 3.0.0
  • Tesseract OCR 5.3.1.20230401

目次

  1. pythonのインストール
  2. OBS studioのインストール
  3. obs-virtualcamのインストール
  4. Tesseract OCRのインストール
  5. OBSの準備
  6. pythonアプリの実行

1. pythonのインストール

pythonでプログラムを記述します。
pythonをインストールします。
python.org

使用するパッケージをインストールします。

pip install opencv-python
pip install pytesseract

2. OBS studioのインストール

OBSを使ってSpatialの画面を仮想カメラに流します。
OBS studioをインストールします。
OBS studio

3. obs-virtualcamのインストール

OBS仮想カメラの画像をpythonで取り込むため、obs virtualcamをインストールします。
obs-virtualcam

4. Tesseract OCRのインストール

文字認識のため、Tesseract OCRをインストールします。
Tesseract OCR

5. OBSの準備

OBSを起動し、Spatialのブラウザ画面を仮想カメラとして設定します。
人が入ってきた時に出るメッセージ以外を認識しないように仮想カメラの範囲をメッセージが出るあたりだけになるようにクロップします。
vlcsnap-2023-04-03-03h54m41s798.png

6. pythonアプリの実行

下記のpythonアプリを実行します。

  • camera_device_indexは実行環境でOBS仮想カメラの番号を指定します。
  • プログラムを実行したカレントディレクトリにLog-YYYYMMDD.txtのファイル名でログを出力します。日付ごとにログファイルができます。
  • SpatialVisitorCounterの画面に仮想カメラの画像が正常に表示されない場合はOBSのツールメニューから"VirtualCam"を起動します。
import cv2
import pytesseract
from difflib import SequenceMatcher
import time

LOG_FILE_PREFIX = "Log"

def string_similarity(a, b):
    return SequenceMatcher(None, a, b).ratio()

def get_log_filename():
    return f"{LOG_FILE_PREFIX}-{time.strftime('%Y%m%d')}.txt"

def capture_and_recognize_text():
    # OBSの仮想カメラを選択
    camera_device_index = 1

    cap = cv2.VideoCapture(camera_device_index)

    prev_recognized_text = ""
    prev_date = time.strftime('%Y%m%d')

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        recognized_text = pytesseract.image_to_string(gray, lang="eng")

        similarity = string_similarity(prev_recognized_text, recognized_text)

        if similarity < 0.9:
            current_date = time.strftime('%Y%m%d')
            if current_date != prev_date:
                prev_date = current_date

            with open(get_log_filename(), "a", encoding="utf-8") as log_file:
                for line in recognized_text.splitlines():
                    if "joined" in line:
                        log_file.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - {line}\n")
                        prev_recognized_text = recognized_text

        cv2.imshow("SpatialVisitorCounter", gray)

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    capture_and_recognize_text()

チームハイエナ hyaeninae_tomei.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1