積雲が映像制作したMV『RANGEFINDER』公開中
専門88IO

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

専門

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

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

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

これはコマンドラインでの起動が必要な簡易的なものです。しかし、プログラミングしてる感に浸りたい人にはいいんじゃないかと思ったので載せておきます。

# 画像書き込み
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を介してアドホック通信をすれば無線通信環境のない学校でも実現可能である。興味を持ったら挑戦してみて。よろしく。

コメント

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