Pythonで簡易デスクトップキャプチャ

専門
スポンサードリンク

* 学校の後輩向け。OpenCV触るらしいし…

ちょっとした画面のキャプチャをしたいときはありませんか?

無料ソフトを使うと、時間制限やロゴ挿入などといった制約があるものも多いです。なら、自分で作ってしまえばいいじゃないか!(迫真)

これは本当に簡易的なものなので、実際に使うのは難しいかもしれません。(コマンドラインでの起動が必須ですから。)しかし、プログラミングしてる感に浸りたい人にはいいんじゃないか(要するに後輩達)と思ったので、載せておきます。

# coding: utf-8
"""
App    : Screen Capture
Author : 88IO
Date   : 2019-12-04
"""

# 画像書き込み
import cv2
# 型変換(import cv2 でも呼ばれるのでなくてもよい)
import numpy as np
# スクリーンショット (引数で座標指定可)
from PIL import ImageGrab
# WindowsAPI を触るため
import ctypes
# 時間計測
import time

# 画面解像度の取得 Windwos API
user32 = ctypes.windll.user32
capSize = (user32.GetSystemMetrics(0), user32.GetSystemMetrics(1))
# コーデックの設定 今回は.mov
fourcc = cv2.VideoWriter_fourcc(*"DIVX")
# 動画保存用
writer = cv2.VideoWriter("SC.mov", fourcc, 10, capSize)
# FPSのカウント用 1度だけ
count = 0
FirstFlag = True
# 開始時間の保存
sTime = time.time()

# writerが開いている間、ループ
while (writer.isOpened()):
    try:
        # PIL Image から numpy配列 に変換してから書き込み
        writer.write(np.asarray(ImageGrab.grab()))
        # FPS取得 1度だけ
        if FirstFlag:
            count += 1
            # 開始から1秒たったら、そのときのcountをFPSとする
            if time.time() - sTime > 1.0:
                writer.set(cv2.CAP_PROP_FPS, count)
                print("FPS: {}".format(count))
                FirstFlag = False
    # Ctrl+Cで脱出
    except KeyboardInterrupt:
        break

# writerの解放 -> 保存
writer.release()

改善点

  • Ctrl+Cで終了するので、コマンドラインでの起動が必要となる。GUI化、OpenCVのwaitKey()によるキー判定等で対策
  • ImageGrab.grab()は引数でキャプチャ範囲指定ができるので、任意で設定できるようにする
  • PillowライブラリのImageGrabはWindows及びMac専用なので、Linuxにも対応させる
  • 開発環境下では20FPS程であったので、それ以上を求める場合、C++等のネイティブコードに移植
  • pyinstaller等でexe化するときにOpenCVライブラリが原因で肥大化するので、画像生成と動画生成を分割し、動画生成はffmpeg等で行う
  • 動画の拡張子、出力ファイル名の指定をできるようにする

(画像データをバイト列に変換してSocket通信を行えば、PC間での画面共有等に応用できるのではないか。また、Raspberry Piを介してアドホック通信をすれば、無線通信環境のない学校でも実現可能である。興味を持ったら、挑戦してみて。よろしく。)

投稿者:88IO

コメント

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