Broccoli's House
#5-(1) 파이썬을 이용한 게임 이미지 추출 본문
5회차 - (1) 파이썬을 이용한 시뮬레이터(BeamNG Drive) 영상 이미지 추출
- 직접적 방법
간접적 방법
- 소스 코드나 통신을 통해 시뮬레이터에서 영상 이미지를 받아오는 직접적 방식과는 다르게, 파이썬의 라이브러리를 사용하여 컴퓨터 스크린의 화면 자체를 캡처함으로써 간접적으로 시뮬레이터의 이미지를 받아온다.
- 스크린 캡처 방식에는 여러 장점이 있는데 첫째, 간편하다는 것이다. 위의 직접적 방식은 간접적 방식에 비해 꽤나 복잡하다. 간접적 방법을 사용해 이미지를 받아오는데는 코드 두 줄이면 충분할만큼 간단하다. 두 번째는 이미지를 받아오는 것이 빠르다는 점이다. AirSim에서 서버-클라이언트 통신을 통해 시뮬레이터의 이미지를 받는 데에는 대략 60ms 정도가 소요된다(컴퓨터마다 다를 수 있음). 그러나 파이썬의 스크린 캡처 라이브러리 중 가장 빠른 것은 30ms 정도밖에 소요되지 않는다. 마지막으로, 사용할 수 있는 시뮬레이터의 범위가 넓어진다는 점이다. 이미지를 받아오기 위해서 오픈 소스로 된 시뮬레이터(AirSim, TORCS)를 이용하였지만, 스크린 캡처는 굳이 소스가 오픈되어 있지 않아도 이미지를 받아올 수 있으므로 어떤 시뮬레이터나 게임이건 관계없이 사용할 수 있다.
- 스크린을 캡처할 수 있는 파이썬 라이브러리는 많이 있지만, 파이썬 3을 기준으로 PIL의 ImageGrab.grab(), PyAutoGUI의 screenshot(), MSS의 sct.shot() 이 세 가지를 비교해보고자 한다.
라이브러리 |
PIL (ImageGrab.grab()) |
PyAutoGUI (screenshot()) |
MSS (sct.shot()) |
촬영 시간(저장 X) | 30ms |
300ms |
40ms |
촬영 시간(저장 O) |
90ms |
500ms |
100ms |
- 세 라이브러리의 이미지 캡처 함수를 사용하여 캡처를 해본 결과, PIL의 ImageGrab.grab() 함수가 저장을 하지 않았을 때나 저장을 하였을 때 가장 빠른 캡처 성능을 보였다. 이미지의 실시간 처리를 위해서는 이미지를 받아오는 시간이 무조건 짧아야 하는데, 저장을 하지 않았을 때 30ms 정도의 시간이 걸리므로 대략 30fps 정도의 초당 프레임 수가 나온다. 따라서 이미지를 캡처할 때 ImageGrab.grab() 함수를 사용하도록 한다.
- 이미지 추출
- PIL의 ImageGrab.grab() 함수를 사용하여 이미지를 추출해본다. 시뮬레이터로는 차량 손상 시뮬레이터인 BeamNG Drive를 사용하였다.
|
- 위의 동영상에서 우측이 실제 게임 영상이고, 좌측은 영상 이미지를 받아와 반복해서 출력해주는 창이다. 약간의 딜레이를 제외하고는 이미지를 잘 추출하는 것을 볼 수 있다.
'공부 > 캡스톤 디자인' 카테고리의 다른 글
#5-(3) 로지텍 G27에서 조향 데이터 추출 (0) | 2018.03.10 |
---|---|
#5-(2) 게임 이미지 크기 조절 및 흑백 처리 (1) | 2018.03.09 |
#4-(5) TORCS : SCR-패치 클라이언트 설정 (0) | 2018.03.08 |
#4-(4) TORCS : SCR-패치 서버 설정 (0) | 2018.03.08 |
#4-(3) TORCS : 설치 및 설정 (0) | 2018.03.06 |