기본 콘텐츠로 건너뛰기

FastAPI 실시간 영상 스트리밍 OpenCV

    목차

 

FastAPI와 OpenCV를 활용한 실시간 영상 스트리밍Permalink

실시간 영상을 스트리밍 하는 방법을 찾던 중 파이썬 FastAPI를 활용한 방법을 시도 해보았다.


필수 라이브러리Permalink

필요한 것은

Python3.9버전 (애플 M1칩셋 맥북에어에서 3.8 버전으로 시도 해보니 OpenCV라이브러리 설치에서 문제가 발생했었다)
FastAPI
uvicorn
OpenCV

정도면 될 것 같다. 라이브러리들은 모두 설치 되었다고 가정 하고,


예제 코드Permalink

# main.py

# 라이브러리 import
# StreamingResponse를 가져와야함
from fastapi import FastAPI
from fastapi.responses import StreamingResponse

# cv2 모듈 import
from cv2 import get_stream_video

# FastAPI객체 생성
app = FastAPI()

# openCV에서 이미지 불러오는 함수
def video_streaming():
    return get_stream_video()

# 스트리밍 경로를 /video 경로로 설정.
@app.get("/video")
def main():
    # StringResponse함수를 return하고,
    # 인자로 OpenCV에서 가져온 "바이트"이미지와 type을 명시
    return StreamingResponse(video_streaming(), media_type="multipart/x-mixed-replace; boundary=frame")
# cv2.py

import cv2

def get_stream_video():
    # camera 정의
    cam = cv2.VideoCapture(0)

    while True:
        # 카메라 값 불러오기
        success, frame = cam.read()

        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            # frame을 byte로 변경 후 특정 식??으로 변환 후에
            # yield로 하나씩 넘겨준다.
            frame = buffer.tobytes()
            yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' +
               bytearray(frame) + b'\r\n')

실행Permalink

FastAPI를 사용해 웹 서버를 여는 main.py파일과, openCV로 영상 데이터를 얻는 cv2.py모듈을 만들었다.

uvicorn main:app –reload

로 FastAPI서버를 실행 해보고 http://localhost:8000에 접속 해보면 OpenCV에서 불러온 영상들이 실시간으로 브라우저에서 잘 나오는것을 확인 할 수 있었다.

streaming_image

댓글

이 글도 관심 있으실 것 같아요!

놀이의 4대 요소 (Agon(아곤), Mimicry(미미크리), Ilinx(일링크스), Alea(알레아))

네덜란드의 고전 학자인 '요한 하위징아'의 저서인 「호모 루덴스 」에서 인간을 '유희의 인간'이라고 칭했습니다. 프랑스의 '로제 카유아'라는 학자는 「호모 루덴스 」의 이론을 발전시켜 그의 저서인 「놀이와 인간」 (원제 「 Man, plays and games 」) 에서 ‘놀이의 4대 요소’를 말했습니다. 저자는 그것을 아곤, 미미크리, 알레아, 일링크스로 소개했습니다. 이 네 가지 놀이의 요소는 인간의 모든 유희, 놀이에서 발전되어 현대의 비디오 게임에서도 매우 중요한 이론으로 알려져있습니다. 먼저, 아곤(Agon), 경쟁 아곤은 놀이의 주체와 객체간의 경쟁을 의미합니다. 사람들은 경쟁에서 승리함으로써 성취감을 얻고, 우월감을 느끼게 합니다. 이 아곤을 현대의 게임에 대입 시켜보면 경쟁은 최근 가장 많이 플레이 하는 게임 중 하나인 ‘배틀 그라운드’나 ‘리그 오브 레전드’같은 게임들도 경쟁에 기반이 되어있고, 혼자 플레이 하는 게임에서도 자기 자신과의 경쟁, AI와의 경쟁 등이 포함되어있습니다. 예를 들어, 슈퍼 마리오 같은 게임에서도 플레이어들은 어떻게 이 게임을 더 빨리 클리어하기 위해 경쟁하고, 더 많은 점수를 받기 위해 노력합니다. 또한 비교적 MMR시스템이 잘 짜여져있는 '리그 오브 레전드'같은 AOS게임에서도 플레이어의 등급을 결정하는 랭크 게임 시스템이 중점적으로 돌아가고 있고, '오버워치'의 경쟁전 등 많은 게임에서 이런 경쟁을 유도하는 시스템을 만들어 놓았습니다. 게임을 계속 플레이하게 만드는 가장 큰 요소가 아곤입니다. 많은 게임에서 플레이어의 경쟁을 어떻게 잘 이끌어 나갔느냐에 따라서 그 게임의 성공이 나뉠 수도 있습니다. 미미크리(Mimicry), 역할 미미크리는 역할을 의미합니다. 사람들은 실제 세계에서 하지 못하는 일들을 놀이에서 느끼면서 큰 기쁨을 느낄 수 있습니다. 이 역할은 롤플레...

게임의 수학, 스탯과 대미지 계산 시스템을 효과적으로 재미있게 만드는 방법

대부분의 게임들은 스탯이라는 시스템을 가지고 있습니다. 이 스탯이라는 시스템은 대부분의 게임에서 캐릭터가 레벨업을 하거나, 스탯을 추가 시켜주는 아이템을 장착하거나, 스킬을 사용해서 올릴 수 있게 되어 있습니다. 하지만 많은 플레이어들은 이런 스탯을 그저 숫자 쪼가리 이상에 의미를 두려고 하지 않습니다. 그저 자신의 직업에 필요한 스탯의 숫자가 크면 좋다고 느끼는 것입니다. 예를 들어, 메이플 스토리의 스탯은 아예 자동 배분이라는 시스템을 도입하여, 대부분의 플레이어들이 같은 스탯으로 배분되게 되어, 스탯을 찍는다는 행위 자체가 없어졌습니다. 또한, 코어 플레이어가 아닌 일반적인 유저들은 자신의 스탯이 얼마인지, 어떤 방식으로 대미지 계산이 들어가는 지 모르고, 알려고 하지도 않습니다. 이는 메이플 스토리의 스탯과 대미지 계산 시스템이 지나치게 복잡해졌기 때문입니다. 이것은 메이플 스토리의 스트라이커라는 직업이 레벨 10에 배울 수 있는 매우 초반에 활용되는 스킬입니다. 하지만 그럼에도 '90초 동안', '1%확률', '30초 동안', '방어력을 1% 무시', '뇌전 버프', '최대 1회 누적 가능' 이라는 많은 효과와 조건들이 붙어 있습니다. 메이플 스토리의 대미지 계산식을 분석한 한 유저가 적은 대미지 계산식은 아래와 같습니다. 대 미지 = [ (주스탯 * 4 + 부스탯) * 총 공격력 * 무기상수 * 직업보정상수 / 100 ] * (스킬 퍼뎀 / 100) * (크리티컬 발동시) 크리티컬  대 미지 보정 * [ (100 + 공격력%) / 100 ] * [ (100 +  대 미지% + 보공%) / 100 ] * 방어율 무시 보정 * 렙차 보정 * 속성 보정 * (아케인포스 필요 적의 경우) 아케인포스 보정 * 숙련도 보정 * [ (모든 최종 대 미지 계산값% + 100) / 100 ]      (1.1) ...

Super Mario Bros. 1-1스테이지 레벨 디자인 (1)

닌텐도의 Super Mario Bros.는 한때 가장 많이 팔린 비디오 게임 중 하나이고, 역사상 가장 위대한 게임 중 하나일 것입니다. 닌텐도는 타 게임의 '글로 설명하는 튜토리얼'보다 자연스럽게 알아가는 튜토리얼을 잘 만든다고 생각합니다. 이것은 그 당시 롬파일 용량 때문일 수도 있었겠지만, 그것이 현재의 닌텐도 게임까지 이어지고 있죠. 이러한 튜토리얼 방식은 플레이어들에게 더욱 큰 성취감을 주고, 플레이어들에게 불합리하다는 생각을 버리게 합니다. 이 게임의 1-1스테이지는 자연스러운 튜토리얼을 잘 유도했다고 생각합니다. 플레이어가 게임을 시작하면 이 화면을 보게 될 것입니다. 이 화면을 보시면 마리오가 화면의 왼쪽에 있고, 오른쪽을 바라보는 것을 알게 될겁니다. 또한 Super Mario Bros.는 오른쪽으로 이동하면 다시 왼쪽으로 돌아갈 수 없습니다. 이것은 마리오의 진행 방향이 오른쪽이라는 것을 알려주는 것이죠. 그리고 혼자 떨어져있는 ?가 그려진 박스를 볼 겁니다. 이 박스는 플레이어들이 호기심을 가질 수 있는 형태로 만들어졌습니다. 그리고 플레이어들이 다가가면, 굼바를 발견하게 되죠. 굼바는 마리오의 적입니다. 근데 닌텐도는 이것을 플레이어들이 어떻게 인지하게 만들었을까요? 먼저 굼바의 모습입니다. 굼바의 눈썹은 누가봐도 화나있는 모습이죠. 그리고 굼바는 오른쪽에서 왼쪽으로 움직이고, 마리오와는 반대 방향입니다. 굼바를 피하기 위해 플레이어는 점프라는것을 배우게 됩니다. 굼바를 해치운 마리오는 ?가 그려지고 공중에 떠있는 박스에 점프를 할 것입니다. 왜냐구요? 플레이어에게 주어진건 좌,우 움직임과 점프 뿐이거든요. 그럼 플레이어는 그에 맞는 보상을 받게 되고, ?모양의 박스는 좋은 것이라는 것을 알게 되죠. 그리고 ...