【claude3】YlvaVisionAPI(Webカメラからリアルタイムの画像を取得+ブロードキャストするためのAPI)

AI動画生成

こちらの記事もおすすめ

claude.aiで動画を生成する方法
デモ動画Claude 3で動画を生成するヤツやってみた!!これはめっちゃ面白い!! pic.twitter.com/qN8BvH2XA9— Maki@Sunwood AI Labs. (@hAru_mAki_ch) March 10, 2...
Claudeを使用してなんJのスレを作成してみた
最近話題のAIチャットボット「Claude」を使って、なんJ風の架空のスレッドを自動生成してみました。Claudeの高度な言語理解と文脈把握能力により、各キャラクターの口調や性格を見事に再現できていると思います。のんのんびよりのキャラクター...

YlvaVisionAPI

YlvaVisionAPIは、Webカメラからリアルタイムの画像を取得し、ブロードキャストするためのAPIです。このREADMEでは、APIの機能、セットアップ方法、使用方法について説明します。

機能

YlvaVisionAPIは以下の機能を提供します。

  • Webカメラからリアルタイムの画像を取得
  • 取得した画像をブロードキャスト
  • クライアントサイドでブロードキャストを受信し、画像を表示または保存

セットアップ

APIを実行するには、以下の手順に従ってください。

必要なライブラリのインストール

以下のライブラリをインストールしてください。

  • FastAPI: pip install fastapi
  • Uvicorn: pip install uvicorn
  • OpenCV: pip install opencv-python

Webカメラの接続確認

APIを実行する前に、適切なWebカメラが接続されていることを確認してください。必要に応じて、コード内のカメラIDを変更してください。

APIの起動

以下のコマンドを実行して、APIを起動します。


python api\camera_server_broadcast.py

APIが正常に起動すると、http://localhost:8000/cameraでブロードキャストが開始されます。

ブロードキャスト

YlvaVisionAPIは、以下のコードを使用してWebカメラからリアルタイムの画像をブロードキャストします。


from fastapi import FastAPI, Response
import cv2
import numpy as np
from fastapi.responses import StreamingResponse
import asyncio

app = FastAPI()

# WebカメラのIDを指定(デフォルトは0)
camera_id = 0

# カメラオブジェクトをグローバルに保持
cap = cv2.VideoCapture(camera_id)

# カメラの解像度を設定
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

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

        _, img_encoded = cv2.imencode(".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70])
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + img_encoded.tobytes() + b'\r\n')
        await asyncio.sleep(0.01)  # 10ミリ秒のディレイを追加

@app.get("/camera")
async def get_camera_stream():
    return StreamingResponse(gen_frames(), media_type="multipart/x-mixed-replace;boundary=frame")

@app.on_event("shutdown")
async def shutdown_event():
    # アプリケーションが終了するときにカメラを解放
    cap.release()

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

このコードは、FastAPIを使用してWebカメラからリアルタイムの画像を取得し、gen_frames()関数でフレームをエンコードしてブロードキャストします。

クライアントサイドの使用方法

以下は、クライアントサイドでYlvaVisionAPIを使用するサンプルコードです。

ブロードキャストを受信 / リアルタイムで画像を表示


import cv2
import numpy as np
import requests
import time

# ブロードキャストを受信するエンドポイントのURL
url = "http://localhost:8000/camera"

# OpenCVのビデオキャプチャオブジェクトを作成
cap = cv2.VideoCapture(url)

# フレームの処理時間を保存するリスト
frame_times = []

while True:
    start_time = time.time()  # フレームの処理開始時間を記録

    # フレームを読み込む
    ret, frame = cap.read()

    if not ret:
        break

    # フレームの処理時間を計算
    end_time = time.time()
    frame_time = end_time - start_time
    frame_times.append(frame_time)

    # フレームを表示
    cv2.imshow("Camera Stream", frame)

    # 'q'キーが押されたらループを終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 平均フレーム処理時間を計算
avg_frame_time = sum(frame_times) / len(frame_times)

# 結果を表示
print(f"Average Frame Processing Time: {avg_frame_time:.2f} seconds")
print(f"Average FPS: {1 / avg_frame_time:.2f}")

# リソースを解放
cap.release()
cv2.destroyAllWindows()

このコードは、ブロードキャストを受信し、リアルタイムでフレームを表示します。また、フレームの処理時間を計測し、平均フレーム処理時間と平均フレームレートを表示します。

デモ動画

ブロードキャストから画像を取得 / 保存


import cv2
import numpy as np
import requests
import time

# ブロードキャストを受信するエンドポイントのURL
url = "http://localhost:8000/camera"

# OpenCVのビデオキャプチャオブジェクトを作成
cap = cv2.VideoCapture(url)

# 保存するフレームのファイル名
filename = "captured_frame.jpg"

start_time = time.time()  # 処理開始時間を記録

# フレームを読み込む
ret, frame = cap.read()

if ret:
    # フレームを保存
    cv2.imwrite(filename, frame)
    print(f"Frame saved as {filename}")
else:
    print("Failed to capture frame")

# 処理時間を計算
end_time = time.time()
processing_time = end_time - start_time

# 結果を表示
print(f"Processing Time: {processing_time:.2f} seconds")

# リソースを解放
cap.release()

このコードは、ブロードキャストから1フレームを取得し、指定したファイル名で保存します。また、処理時間を計測し、結果を表示します。

撮影画像

まとめ

YlvaVisionAPIを使用することで、Webカメラからリアルタイムの画像を取得し、ブロードキャストすることができます。クライアントサイドでは、ブロードキャストを受信し、画像を表示したり保存したりすることができます。

APIのセットアップと使用方法を理解することで、YlvaVisionAPIをプロジェクトに組み込むことができます。サンプルコードを参考に、必要な機能を実装してください。

コメント

タイトルとURLをコピーしました