質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4993閲覧

特定のウィンドウのスクリーンショットを撮る方法

XiFlashlight

総合スコア16

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/26 07:40

編集2021/09/26 07:42

前提

特定のウィンドウの文字認識をしたく、

特定のウィンドウのSSを撮る → 特定の位置にセット(ウィンドウからの相対位置は一定) → PyOCRで読み取る

といった流れのコードを作りたいと思っているのですが、ウィンドウを最前面に表示せずともSSを撮る方法はあるでしょうか。

OBSといった配信ソフトでは特定のウィンドウをキャプチャーして表示できることから不可能ではいないと考えています。

Pythonで解決できる場合の案を教えていただきたいです。

ソースコード

python

1def ScreenShot(x1, y1, x2, y2): 2   #特定のウィンドウの指定は可能か? 3 sc = pyautogui.screenshot(region=(x1, y1, x2, y2)) 4 sc.save('pic.jpg') 5 img = cv2.imread('pic.jpg') 6 #画像加工 7 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 8 tmp = cv2.resize(gray, (gray.shape[1]*2, gray.shape[0]*2), interpolation=cv2.INTER_LINEAR) 9 cv2.imwrite('pic.jpg', tmp)

補足

この方のQiitaを参考にさせていただきました。

Windows 10
Python 3.9.6
PyAutoGui 0.9.53
PyOCR 0.8
OpenCV-Python 4.5.3.56

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、ウィンドウを最前面に表示せずにキャプチャするのはPythonではかなり厳しいと思います。
そこを妥協すれば、以下のようなコードでウインドウ領域を取ることができるので、それをもとにキャプチャは可能です。
なお、マルチディスプレイおよびその配置、解像度違いなどにより意図した結果が得られない可能性はあります。

Python

1import ctypes 2from ctypes import sizeof, byref 3from ctypes.wintypes import RECT 4 5import win32gui 6import pyautogui 7 8# 指定のタイトルを持つウインドウを最前面にして領域を返す 9def get_region( title): 10 ret = None 11 12 def enum_proc( hwnd, _): 13 nonlocal ret, title 14 name = win32gui.GetWindowText(hwnd) 15 if name.find(title) >= 0: 16 ret = hwnd 17 return False # 列挙終了 18 19 # Python3.7 で EnumWindows の列挙を止める際に EnumWindowsProc に 0 を返すとエラーが発生する 20 # https://teratail.com/questions/274340 21 try: 22 win32gui.EnumWindows( enum_proc, 0) 23 except: 24 pass 25 26 if ret: 27 rect = RECT() 28 ctypes.windll.dwmapi.DwmGetWindowAttribute(ret, 9, byref(rect), sizeof(rect)) 29 region = (rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top) 30 31 win32gui.SetForegroundWindow(ret) 32 33 return region 34 35region = get_region('フォト') 36if region: 37 sc = pyautogui.screenshot(region=region) 38 sc.save('pic.jpg')

実行結果
イメージ説明

投稿2021/09/27 02:33

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問