Web会議中のトイレ退席をOBSで視覚的に伝える方法

## はじめに
初めましての人もそうでない人もこんにちは！
私は以前Zoomで1on1面談イベントに参加中にトイレに行きたくなりました！
休憩中だったので急いで行ったもののあまりに時間がかかってしまい、3分くらいオーバーしてしまいました...
さらにオーバーしている間「大丈夫ですかー」と声をかけていただいたみたいで本当に申し訳なかったです。

そこで今回はOBSのアプリを使ってコメントや画面共有せずともトイレに行っていることを伝えられるような方法を教えればと思います！

## 手順
### ステップ1：画像を探す
まずは伝えるための画像を用意しましょう！
今の時代は便利なので「トイレ フリー素材」みたいな感じで調べればいい感じのフリー素材があるはずです！

### ステップ2：OBS Studioをインストールする

https://obsproject.com/ja/download

こちらのサイトからお使いのデバイスに合わせてダウンロードしてください！

### ステップ3：OBSの仮想カメラ設定を行う
ダウンロードが完了したらアプリを起動して試しに左下にある仮想カメラをオンにしてみてください！
おそらくですがエラーみたいなものが表示されると思います！

https://obsproject.com/forum/threads/the-virtual-camera-is-not-installed-why.170956/

その場合はこちらのサイトが解決策を教えてくれています！
「システム設定」→「一般」→「ログイン項目と機能拡張」→「カメラ機能拡張」→ OBSオン

この順番で進めるとうまく仮想カメラが起動すると思います！

### ステップ4：コーディング
**＊おそらくコードを書く必要性は全くありませんがご容赦ください**
```camera.py
import cv2
import numpy as np
import time

class StaticImageCamera:
    def __init__(self, image_path: str, width: int = 1280, height: int = 720):
        self.image_path = image_path
        self.width = width
        self.height = height
        self.window_name = 'toilet'
        
    def load_image(self) -> bool:
        try:
            image = cv2.imread(self.image_path)
            if image is None:
                print(f"Error: Could not load image from {self.image_path}")
                return False
                
            aspect = image.shape[1] / image.shape[0]
            if aspect > (self.width / self.height):
                new_width = self.width
                new_height = int(self.width / aspect)
            else:
                new_height = self.height
                new_width = int(self.height * aspect)
                
            self.image = cv2.resize(image, (new_width, new_height))
            
            self.final_image = np.zeros((self.height, self.width, 3), dtype=np.uint8)
            y_offset = (self.height - new_height) // 2
            x_offset = (self.width - new_width) // 2
            self.final_image[y_offset:y_offset+new_height, 
                           x_offset:x_offset+new_width] = self.image
            
            return True
        except Exception as e:
            print(f"Error loading image: {e}")
            return False
            
    def run(self):
        try:
            if not self.load_image():
                return
                
            # ウインドウを作成
            cv2.namedWindow(self.window_name, cv2.WINDOW_NORMAL)
            cv2.resizeWindow(self.window_name, self.width // 2, self.height // 2)
            
            while True:
                # ウインドウの表示
                cv2.imshow(self.window_name, self.final_image)
                
                # 終了処理 ('q'キーで終了)
                if cv2.waitKey(1) & 0xFF == ord('q'):
                    break
                    
                time.sleep(1/30)
                
        finally:
            cv2.destroyAllWindows()

def main():
    # 画像のパスを設定
    image_path = "画像ファイルのパスを入れる"
    
    width = 1280
    height = 720
    
    app = StaticImageCamera(
        image_path=image_path,
        width=width,
        height=height
    )
    app.run()

if __name__ == "__main__":
    main()
```

### OBS設定
次にOBSの設定を行います！
「ソース」→「＋」→「非推奨」→「ウィンドウキャプチャ」の順で追加してください！
次に各種設定が以下になっていることを確認してください！
- 仮想カメラの右にある設定マークをクリックして出力の種類がプログラムになっている
- 仮想カメラがONになっている
- 画面中央のウィンドウ右にあるパスがPythonプログラムのwindow_nameのものになっているか(今回のコードでいうところの10行目の「toilet」になっているか)

確認してみてください！

**全画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631203/220a67b6-684f-e0d8-b761-f16699755810.png)
**仮想カメラ設定画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631203/5556968d-be4c-e76d-655f-c477367c0275.png)

## 試しにやってみた
これで画面共有もコメントもせずに視覚的にトイレに行っていることを教えることができます!
今回は自分が持っているデバイスの都合上Google MeetでスマホとPCを使って再現してみます！
やり方は非常に簡単で相手とのWeb会議の開始後トイレに行きたくなったらビデオマークの隣にある「^」を押して設定の「動画」→「カメラ」→「OBS Virtual Camera」を押すだけです！
すると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631203/e9118242-b526-6c9c-759b-4b31a51899af.png)

Google Meetの使用上こちらからは反転していますがおそらく相手の方には伝わっていると思います！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631203/11130304-da85-129b-f98d-6ac7d35a93a5.png)

画像が荒くて本当に申し訳ないんですが無事に伝えることができそうですね！

似たような手順でZoomやTeamsもできると思うのでみなさんぜひトイレに行きたくなったらやってみてください！

## おわりに
今回の記事はいかがだったでしょうか？
「コード書く必要なくない？」「コメントとかで伝えれば良くない？」というツッコミなどは百も承知ですがそこら辺のことについては寛大な心で許していただければ幸いです！

年末年始も近づいてきており忙しい中この記事をみてくださってありがとうございます！
またどこかの記事でお会いしましょう！