俺言語。

自分にしか理解できない言語で書かれた備忘録

【Python】win32apiを使ってデスクトップ座標の取得

デスクトップ座標をwin32apiを使ってゲットするにはまずc言語での構造体を

python上で定義してあげる必要がある。

今回は構造体用にクラスを作ってそのインスタンスを使う。

# 構造体を定義
class _pointer(ctypes.Structure):
    _fields_ = [
        ('x', ctypes.c_long),
        ('y', ctypes.c_long),
    ]

pointer = _pointer() #←構造体を初期化

ポインタがある位置の座標を返すwin32apiは"user32.GetCursorPos"
これに先ほど作った構造体を引数で渡す。

# 構造体のポインタを引数で渡す(参照渡し)
ctypes.windll.user32.GetCursorPos(ctypes.byref(point_topleft))

すると構造体に座標が入るので必要に応じて取り出す
取り出し方は

print pointer.x
print pointer.y

取得できる座標はデスクトップ左上を(0, 0)とした座標系,

マルチディスプレイの時はxがマイナスの値になっていた。

【Python】FFmpegでのエンコード時に出たエラー Error while opening encoder for output stream #0.0

ネットを探すとどうやらH.264エンコードする際によく出るみたいだけど,

自分のところではwmvでも発生した。

原因はおそらくソースの動画サイズが 495x697で奇数だったこと。

FFmpegのオプションで -s 494x696 を指定したら上手くいった。


H.264でのエラーはこちらが参考になる。
blog.k-tai-douga.com

【Python】matplotlibでy2軸のグラフに凡例を表示させる方法

y2軸のグラフを書いてそれぞれの軸の凡例をまとめて表示しようとした際,

普通にlengedを呼ぶだけだとうまくいかない。

グラフのハンドルと表示名を引数に与えてあげる必要がある。

それでもはまったのがグラフのハンドルは通常リストなので

legendにそのまま与えてもうまくいかなかった。


正しくはこちら↓

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()

l1 = ax1.plot([0, 100], [0, 100])
l2 = ax2.plot([0, 50], [0, 100])

ax1.plot((l1[0], l1[0]), ("line1", "line2") #←ここが大事

下記が参考になりました。感謝!
konjo-p.hatenablog.com

【Python】pytesseractを使ってみた

OCRモジュールのpytesseractのPython版を使ってみた。

最初はtesseractを使ってみたけど何故かPythonが動作停止に。

その前にまずpythonのtesseractはC++のラッパーなのでtesseract-OCRのインストールが必要。
github.com

その次にPythonで下記を実行

import tesseract

#tesseractオブジェクト作成
api = tesseract.TessBaseAPI()
api.Init(".", "eng", tesseract.OEM_DEFAULT)
api.SetPageSegMode(tesseract.PSM_AUTO)

#画像ファイル読み込み
mBuffer=open("img.jpg", "rb").read()

#文字情報取得
print tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)

すると tesseract.ProcessPagesBuffer()を実行するところで何故か必ずpythonが落ちる。

原因が分からなかったので違うラッパーのpytesseractを使ってみた。
pypi.python.org
その結果うまくいった。下記がその時のコード

import pytesseract
import Image

img = Image.open("sample.jpg")
print pytesseract.image_to_string(img, config = "nobatch digits")

configに"nobatch digits"を指定すると全て数値に変換(数値のみ読み取り?)するようになる。

\Tesseract-OCR\tessdata\configs\digits がその設定ファイルで

tessedit_char_whitelist 0123456789-.

を書き換えると任意の文字のみにも対応可能らしい。
参考↓
www.netplan.co.jp

【Python】ベクトルから要素の抽出(条件と一致したもの,Trueのインデックス)

Numpyで動作は確認しているがlistで動作するかは未確認 -> 2019.5.13 listの場合を追加
これは覚えておくと便利

numpyの場合

条件に合うものを抽出

a = numpy.array([1,2,3,4,5,6])
a = a[a%2 ==0] 
>>array([2, 4, 6]) #←条件が合う要素のみが返る

2016.11.13追記:np.whereでも同じ様に動作。np.whereは条件が一致するインデックスを返すみたい。

a = a[np.where(a%2 == 0)]

# 複数条件の場合は
a = a[np.where((a%2 == 0) & (a > 2))]


Trueになっているインデックスと同じ要素を抽出

a = numpy.array([1,2,3,4,5,6])
b = numpy.array([-3,-2,-1,0,1,2,3])
c = b < 0
>>array([ True,  True,  True, False, False, False, False], dtype=bool) #←TrueかFalseが返る

d = b[c]
array([-3, -2, -1]) #←Trueが入っているインデックスのみ抽出して返す

ちなみにnumpyのBool配列を反転するには反転演算子~を使う

e = ~c 

listの場合

条件に合うものを抽出

## list内包表記を使う必要あり
a = [1,2,3,4,5,6]
b = [x%2 ==0 for x in a]
>>[False, True, False, True, False, True]

b = [x for x in a if x%2==0]
>>[2, 4, 6]

奇数の数値が含まれているかどうか

## list内包表記を使う必要あり
a = [1,2,3,4,5,6]
b = [x%2 ==0 for x in a]
>>[False, True, False, True, False, True]
c = any(b)
>> True

## 使用例
if any([x%2 ==0 for x in a]):

【Python】Numpyのndarrayは1xN行列とベクトルが全くの別物!

MATLABと大きく違う点を今更ながら気づいた…。
なんかおかしいな、やりづらいなと思っていた点ですっきりしたのでメモ。

numpy.arange(0,10,1) 
>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # ←これはベクトル

a = numpy.arange(0,10,1)
a.reshape(1,10)
>> array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) # ←これは1*10の行列

よってpythonのベクトルは転置しても何も変わらず。
MATLABは1*N行列の転置はN*1行列だったのだが。


これは場合によってベクトルになるか行列なるか変わってしまう変数aに
a[0,1]でアクセスしようとしてエラーが出て気付いた。
ベクトルの場合はa.shapeでみると[n,]と表示される。


これはMATLABに慣れた人にはとっつきづらいような…。

↓こちらが参考になる。この人もこの仕様には不満がありそう。
kaisk.hatenadiary.com

【Python】クリップボードからデータ取得

沢山の方法があってどれを使うといいのか迷ってしまう。
いくつか試したのでその結果のメモ。

1. win32clipboard(pywin32の一部と思う)

# ストリームを開く
win32clipboard.OpenClipboard()
# データ取得
win32clipboard.GetClipboardData()
# ストリームを閉じる
win32clipboard.CloseClipboard()

これは簡単
これだと例えばエクセルのセルを複数コピーした状態だと
すべてつながって1つのstrになる。
np.array()でndarryaに変換しようとするとMemoryErrorがでて使い物にならなかった。。


2.pandasのread_clipboard

これは大きなデータでも処理できた(1.でダメだった65534行のエクセルデータでもok)
これはデータフレーム型で読み込まれるので
as_matrixなどで変換が必要

clipdata = pd.read_clipboard()
outdata = clipdata.as_matrix()

こちらが非常に参考になった↓
jn1inl.blog77.fc2.com