모니터 스트리밍 확대(30,60 fps)

김성빈·2024년 5월 23일
0

Modern Computer Vision

목록 보기
49/117
MacOS or Linux

pip install Pillow
sudo -H pip install pyscreenshot
Windows

pip install Pillow
pip install pyscreenshot

Pillow : 이미지 로딩, 저장, 크기 조정, 회전, 필터링 등에 사용되며 이번에는 크기 조정에 사용
pyscreenshot : 스크린샷을 쉽게 찍을 수 있도록 도와주는 패키지

1. 화면 전체를 캡처하고 그 이미지를 저장

import pyscreenshot as ImageGrab

# 전체 화면 캡처
im = ImageGrab.grab()

# 이미지 파일 저장
im.save('fullscreen.png')

pyscreenshot 라이브러리에서 ImageGrab 모듈을 가져와서

ImageGrab.grab() 함수를 사용하여 현재 화면의 전체를 캡처 후 저장

2. 화면을 캡처하고 그 화면을 실시간으로 표시 (30fps)

화면 확대라는 말이 이해가 잘 안되지만,

이 코드를 실행시켜보면 무슨 말인지 이해가 된다.

import numpy as np
from PIL import ImageGrab
import cv2
import time

last_time = time.time()

while(True):
    
    # (700,700)에서 (1000,1000)까지의 영역을 캡처하여 frame 변수에 저장
    frame = np.array(ImageGrab.grab(bbox=(700,700,1000,1000)))
    
    # 전체 화면 캡처
    #frame = np.array(ImageGrab.grab())
    
    # FPS(초당 프레임) 표시
    FPS = 1.0 / (time.time()-last_time)
    print('FPS = {}'.format(FPS))
    last_time = time.time()
    
    # 화면 표시
    cv2.imshow('window', cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    
    if cv2.waitKey(1) == 13: #13은 Enter 키입니다.
        print("Exited...")
        break
        
cv2.destroyAllWindows()

저 window라는 창은 내 1920x1080 전체 화면을 캡처한 부분에서

frame = np.array(ImageGrab.grab(bbox=(700,700,1000,1000))) 부분만큼을 확대해서 보여준다.


대충 표현하자면 내 화면의 저부분을 확대해서 스트리밍 한다는 것이다.

잘 보이진 않지만 오른쪽 코드 동작하는 부분에서 FPS 라고

Window의 프레임도 실시간으로 출력해준다.

3. 화면을 캡처하고 그 화면을 실시간으로 표시 (60fps)

훨씬더 부드럽게 스트리밍을 한다.

확실히 30보단 60이 더 부드럽다.

방법은 MSS(Multiple Screen Shots) 라이브러리를 사용했다.

MSS는 스크린샷을 빠르게 캡처할 수 있도록 도와주는 Python 라이브러리이다.

pip install mss

import numpy as np
import cv2
from mss import mss
from PIL import Image
import time

# 캡처할 화면 영역을 설정합니다.
bounding_box = {'top': 100, 'left': 0, 'width': 400, 'height': 300}

# mss 객체를 생성합니다.
sct = mss()

# 프레임 카운트와 시간 초기화
frame_count = 0 
last_time = time.time()

while True:
    frame_count += 1
    # 지정한 bounding_box 영역의 스크린샷을 캡처합니다.
    sct_img = sct.grab(bounding_box)
    # 캡처한 이미지를 numpy 배열로 변환하여 OpenCV의 im0show 함수로 화면에 표시합니다.
    cv2.imshow('screen', np.array(sct_img))

    # FPS(초당 프레임) 표시
    if frame_count % 30 == 0:  # 30프레임마다 FPS를 계산하여 표시합니다.
        FPS = 1.0 / (time.time()-last_time)
        print('FPS = {}'.format(FPS))
    last_time = time.time()    

    if cv2.waitKey(1) == 13: #13은 Enter 키입니다.
        print("Exited...")
        break
        
cv2.destroyAllWindows()

profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글