MacOS or Linux
pip install Pillow
sudo -H pip install pyscreenshot
Windows
pip install Pillow
pip install pyscreenshot
Pillow : 이미지 로딩, 저장, 크기 조정, 회전, 필터링 등에 사용되며 이번에는 크기 조정에 사용
pyscreenshot : 스크린샷을 쉽게 찍을 수 있도록 도와주는 패키지
import pyscreenshot as ImageGrab
# 전체 화면 캡처
im = ImageGrab.grab()
# 이미지 파일 저장
im.save('fullscreen.png')
pyscreenshot 라이브러리에서 ImageGrab 모듈을 가져와서
ImageGrab.grab() 함수를 사용하여 현재 화면의 전체를 캡처 후 저장
화면 확대라는 말이 이해가 잘 안되지만,
이 코드를 실행시켜보면 무슨 말인지 이해가 된다.
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의 프레임도 실시간으로 출력해준다.
훨씬더 부드럽게 스트리밍을 한다.
확실히 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()