matplotlib basemap - Pythonで白地図を作る

今回は、Pythonで白地図を作る方法をご紹介します。

matplotlib basemap - https://matplotlib.org/basemap/

インストール

Anaconda Promptを開いて下記のコマンドを実行します。

1
2
conda install -c conda-forge basemap
conda install -c conda-forge basemap-data-hires

インストールに成功すると Anaconda Navigator でライブラリ一覧に「basemap」と「basemap-data-hires」が表示されます。

インストール済みのライブラリ一覧


コーディング

日本の白地図を表示するために下記のコードを準備します。

14-15行目で描画したい範囲の緯度と経度の座標を指定しています。
16行目のresolutionは解像度を指定しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plot
#-------------------------------------------
# KeyError: 'PROJ_LIB' 回避のため
import os
import conda

conda_file_dir = conda.__file__
conda_dir = conda_file_dir.split('lib')[0]
proj_lib = os.path.join(os.path.join(conda_dir, 'share'), 'proj')
os.environ["PROJ_LIB"] = proj_lib
#-------------------------------------------
from mpl_toolkits.basemap import Basemap

map = Basemap(llcrnrlon=128, urcrnrlon=147,
urcrnrlat=47, llcrnrlat=30,
resolution='l')
map.drawcoastlines()
plot.show()

このコードを実行すると下記のように日本の白地図が表示されます。

日本の白地図

Chromeリモートデスクトップで[Alt+TAB]を使いたい

PCをリモートで操作するためにしばらくTeamViewerを使っていましたが、商用利用検知されるようになりまともに使えなくなりました。
有料版のTeamViewerはなかなか高価なため、代替ソフトとして無料のChromeリモートデスクトップを使うようになりましたが、とても使いづらい点が。。。

それは [Alt+TAB]でアプリケーションの切り替えができないこと。

ネットで調べても『ブラウザで操作しているからリモートPC上での[Alt+TAB]切り替えができない』という意見ばかりで困っていましたが、意外と簡単に[Alt+TAB]が使えるようになりましたのでご紹介します。

設定方法

まずChromeリモートデスクトップで他のPCに接続します。

接続が成功すると画面右に「セッションのオプション」を設定できるエリアが表示されます。

セッションのオプション


ここで「全画面表示」にチェックを入れると、全画面表示になり[Alt+TAB]でリモートアクセスしているPC上でアプリケーションの切り替えを行うことができるようになります。

[Alt+TAB]を使うことででPCの使い勝手は各段に向上するので、とてもオススメのコンビネーションキーです。

Python pynput - マウスボタンを連打する(2)

前回に引き続きキーボードやマウス操作を行うライブラリ「pynput」をご紹介します。

前回は、単純に左クリックを連打するプログラムを作成しましたがこのままではとても使いにくいです。

今回は使い勝手をよくするために、ファンクションキー[F12]を押すと連打が有効になり、もう一度押すと連打が解除されるように実装します。

コーディング

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from pynput.mouse import Button, Controller
from pynput.keyboard import Key, Listener
import threading, time

def mouseclick(e):
while True:
if e.isSet(): # F12が押されて有効化したときに左クリック連打を行う
Controller().click(Button.left)
time.sleep(1) # 1秒待ち

e = threading.Event()
t = threading.Thread(target=mouseclick, args=(e,))
t.setDaemon(True)
t.start()

def on_press(key):
global e
if key == Key.f12: # F12が押されたら有効・無効を切り替える
if e.isSet():
e.clear()
else:
e.set()
if key == Key.esc: # ESCが押されたらプログラムを終了する
return False

with Listener(on_press=on_press) as listener:
listener.join()

Python pynput - マウスボタンを連打する(1)

キーボードやマウス操作を行うライブラリ「pynput」をご紹介します。

「キー入力」や「マウスを動かす」「クリックする」などのほか、その操作をした時の「イベント」を処理することもできます。

インストール

次のコマンドを実行し「pynput」をインストールします。

1
pip install pynput

コーディング

次は1秒おきに左クリックを行うソースになります。

1
2
3
4
5
6
7
8
9
10
11
from pynput.mouse import Button, Controller
import threading, time

def mouseclick(e):
while not e.isSet(): # e.set()が実行されるまでFalseを返す
Controller().click(Button.left) # 左ボタンをクリックする
time.sleep(1) # 1秒待ち
e = threading.Event()
threading.Thread(target=mouseclick, args=(e,)).start() # スレッドを開始する
input() # 入力待ち
e.set() # e.isSet()がTrueになる

プログラムを実行すると、連打が始まります。
コンソール上で「Enter」キーを押すと連打がとまります。

Python PyAutoGUI - GUI作業の自動化

GUI操作を自動化できればPCの単純操作を任せることができるようになり大変便利です。

今回は、GUI操作を自動化するライブラリの「PyuAutoGUI」をご紹介します。

インストール

1
pip install PyAutoGUI

コーディング

簡単に座標位置をクリックするだけのコードは次のようになります。

1
2
3
4
import pyautogui

pyautogui.moveTo(100, 100)
pyautogui.click()

この処理は「moveTo」と「click」を合わせて下記のように書くこともできます。

1
pyautogui.click(100, 100)

座標を調べたい場合は、下記のコードを実行するとマウス位置の座標を調べることができます。
1
2
3
4
5
6
7
8
9
10
import pyautogui

pos1 = []
while True:
pos2 = pyautogui.position()
if pos1 == pos2:
pass
else:
print(pos2)
pos1 = pos2

ただ座標位置を指定する方法ですと、座標をいちいち調べないといけませんし座標が変わってしまうようなときには対応できなくなります、

このようなときには「画像マッチング機能」を使い画像を探してクリックや入力するなどの操作を行います。

1
2
3
4
5
6
7
8
9
10
11
import pyautogui, time

while True:
# 'btn.png'には探すべき画像ファイルを指定
btn = pyautogui.locateCenterOnScreen('btn.png')
if btn is None:
pass
else:
print('find!')
pyautogui.click(btn)
time.sleep(1)

locateCenterOnScreenメソッドを使うと、画像とマッチした座標を探すことができます。
上記のコードでは、対象の画像が見つかった場合にその画像のクリックを行います。

Python OCR - 画像からテキストを取り出す

スキャンした画像やカメラ画像などから、テキストを抽出できると大変便利です。

テキストを抽出するにはOCR処理を行う必要があります。

今回はGoogle社が提供する「tesseract-ocr」を使って画像からテキストを抽出してみます。

インストール

まず下記サイトから「tesseract-ocr-w64-setup-v5.0.0-alpha.20200223.exe」をダウンロードしてインストールします。

tesseract-ocr - https://github.com/UB-Mannheim/tesseract/wiki

インストール中にコンポーネントを選択する画面が表示されますので
[Additional language data(download)] から、[Japanese] と [Japanese(vertical)] の2つを選択しておきます。

コンポーネント選択


次に「tesseract-ocr」をインストールしたフォルダ・パスを、環境変数 path に追加します。

私は「C:\Util」配下へインストールしましたが、みなさんの環境に合わせて設定して下さい。

環境変数(例)


最後に、pyocrをコンソールからインストールします。

「pyocr」は「tesseract-ocr」を使うためのライブラリで、pipコマンドで次のようにインストールします。

1
pip install pyocr

コーディング

Pythonで下記のようにコーディングし、実行します。
1
2
3
4
5
6
7
8
from PIL import Image
import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
img = Image.open('c.png')
txt = tools[0].image_to_string(img, lang='jpn', builder=pyocr.builders.TextBuilder())
print(txt)
6行目には読み込ませる画像を設定します。 7行目のlangパラメータは 'jpn' が日本語、'eng' だと英語での認識となります。

検証1

最初に簡単だと思われる平仮名だけの画像で試してみました。

平仮名の画像

結果は「うとん」。
おしい・・・濁点が読み取れなかったようです。

検証2

次にアルファベットの画像を試してみました。

アルファベットの画像


結果は「SearchPrevlew」・・・・一瞬正解のように思えましたが 'i' のところを 'l' と誤って認識しています。

これは言語のパラメータを’jpn’から’eng’に変えて再度試したところ「SearchPreview」と正しく認識されました。
言語パラメータを合わせるのも大事なようです。

検証3

最後に漢字が含まれる2行の画像で試してみました。

漢字が含まれる2行の画像


結果は・・・

「ここにファイルをドラッグ&ドロップしてください。
 お使いのブラウザが対応していれば」

完璧です。

ただほかにも難しめの漢字などを試してみましたが結果はよくありませんでした。

最初に大まかにOCRでテキスト化して、最後に人が確認するというように分担すれば作業効率化を図ることは可能かと思います。参考になれば幸いです。

Python Pillow - 画像に重ねて文字を描く

ブログやサムネイル作成など、画像に文字を重ねたいことがあります。

GIMPやペイントなどのグラフィックスソフトを使い、手作業で文字を入れることもできますが、コピーライトなど同じ文字を何度も入れたい場合は自動化すると便利です。

今回はPillowというライブラリを使って画像にテキストを追加する処理を自動化していきます。

インストール

まずは、Pillowをインストールします。
1
pip install pillow

コーディング

Pythonで下記のようにコーディングし、実行します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from PIL import Image, ImageDraw, ImageFont

text = 'Sample' # 画像に追加する文字列を指定
img = Image.open('owl.png') # 入力ファイルを指定

imagesize = img.size # img.size[0]は幅、img.size[1]は高さを表す
draw = ImageDraw.Draw(img) # ImageDrawオブジェクトを作成

font = ImageFont.truetype("arial.ttf", 64) # フォントを指定、64はサイズでピクセル単位
size = font.getsize(text)

# 画像右下に'Sampleと表示' #FFFは文字色(白)
draw.text((imagesize[0] - size[0], imagesize[1] - size[1]), text, font=font, fill='#FFF')
# ファイルを保存
img.save('out.png', 'PNG', quality=100, optimize=True)
入力に指定した画像ファイルは下記となります。

入力画像

出力画像

正常に処理ができると次のように文字が追加された画像ファイルが出力されます。

出力画像

Python OpenCV - 動画のサムネイルを作る

動画を管理するときにはサムネイルがあると便利です。

サムネイルは、動画を再生してキャプチャしたり動画編集ソフトで切り出したりすることで作成できます。ただ数が多いと大変な作業となります。

PythonとOpenCVを使えば、動画からサムネイルを簡単に作ることができます。


インストール

まずは、OpenCVをインストールします。
1
pip install opencv_python

コーディング

Pythonでコーディングします。
1
2
3
4
5
6
7
import cv2
file = 'samp.mp4' # 動画のファイル名(パス)を指定
cap = cv2.VideoCapture(file)

cap.set(cv2.CAP_PROP_POS_MSEC, 1000) # 再生位置を第2引数にミリ秒で指定
res, img = cap.read()
cv2.imwrite('cap.png', img)
5行目ではキャプチャしたい再生位置をミリ秒で指定します。

再生位置を変えて5~7行目の処理を繰り返せば、サムネイルを繰り返し作成することができます。
(ファイル名も変更する必要がありますので気を付けてください。)


よく使うプロパティ

上記のサンプルコードでは、再生位置を指定する場合「CAP_PROP_POS_MSEC」プロパティを使いましたが、それ以外でもよく使うプロパティを表にまとめておきます。

cap.getメソッドを使ってプロパティを指定すれば、動画の各種情報が取得できます。

プロパティ名説明
CAP_PROP_POS_MSEC0再生位置を時間で表したもの(ミリ秒単位)
CAP_PROP_POS_FRAMES1再生中のフレーム番号
CAP_PROP_FRAME_WIDTH3フレームの幅
CAP_PROP_FRAME_HEIGHT4フレームの高さ
CAP_PROP_FPS5フレームレート
CAP_PROP_FRAME_COUNT7全フレーム数

Python ハッシュ - 同じ内容のファイルを見つける

ファイルが同じかどうかを比較するにはハッシュが便利です。

ハッシュはデータの並びの特徴を表した数値です。
その値が同じであれば、データが同じである確率がとても高くなります。


コード

下記のソースでは指定されたフォルダ(4行目)内に同じ内容のファイルがある場合、そのファイルを表示します。

今回は「SHA256」という種類のハッシュで計算しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os, sys, glob, hashlib
hashlist = {}
# チェックするフォルダパスを指定
path = './work'

for f in [path + '\\' + f for f in os.listdir(path)]:
data = open(f, 'rb').read()
# ファイルのハッシュを計算
h = hashlib.sha256(data).hexdigest()
if h in hashlist:
if data == open(hashlist[h], 'rb').read():
print(hashlist[h] + 'と' + f + 'は同じ')
# os.remove(f) # 重複ファイルを削除する
else:
hashlist[h] = f

13行目のコメントアウトを外すと重複したファイルを消すことができます。