nyanpyou Note

主な目的は調べたり作ったりしたプログラミング備忘録(予定)

下書きのまま忘れられていたメモ書き

メモ代わりに書きつけたまま公開せずに放置されていたことに気づいたので放り投げます←
最近作りたいものを思いつき、そのためにまた新しいことを学ぼうとしているところなので、それについてまとめるかもしれない。

以下供養のメモ書き

format()関数を使った時の値の表示方法にちょっとこだわりたくなった(6桁固定で左埋めにするとか小数点以下は何桁で固定するとか)ので書式の弄り方について調べた。

docs.python.org

format関数を使っている時に{}を文字列として使いたい時は、{{}}と二重にしておけばエスケープして使える。
文字列中にUnicodeを使いたい時は、\uでエスケープしてやるとそのUnicodeに割り当てられた文字が表示される。例えば

print("\u2642")

とすれば

>>♂

と表示される。


os.system()を使えばPythonからコンソールのコマンドを使えるが、subprocess.call()を使った方がいいらしい。

docs.python.org


numpyのndarrayはtolist()メソッドを使うとリストに変換できる。


ANSIエスケープシーケンスを使えば、コンソール上でカーソルを上下左右自在に動かしたり、文字に色を付けたりできるらしいが、Windowsコマンドプロンプトは悲しいことに対応していない…。UNIXだと使えるという話。
python上からsubprocess.call()でclsコマンドを実行させると遅い(自分の環境だと1秒くらいかかった)ことが分かったので、エスケープシーケンスで何とか改善できないかと思ったものの断念。
以下の記事を見てコマンドプロンプトでアニメーションを高fpsで描画させてみたいと思ったのだが、良い方法知ってる方がいたら教えてください(1日かかってもわからなかったので結局fps落とした←)。

dev.classmethod.jp


Tkinterで使える色のリスト

memopy.hatenadiary.jp


OpenCVのcap.set()を用いて解像度を変更するとき、(録画ソフトなどで確認した)カメラに設定可能な解像度を指定しているのにもかかわらず、設定した解像度にならない事がある。

import cv2
WIDTH = 1280
HEIGHT = 720
FPS = 30

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
cap.set(cv2.CAP_PROP_FPS, FPS)

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)

while(cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow("",frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

f:id:nyanpyou106:20200707113649j:plain
上記のように16:9の解像度を指定しても、左右に帯が入ってしまう。
この場合はcv2.VideoCapture()で、引数にcv2.CAP_DSHOWを指定してやると解決する。

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

f:id:nyanpyou106:20200707113743j:plain
黒帯だった部分が埋まった。

下記記事ではcv2.CAP_DSHOWを指定すると、16:9で映せるようになる代わりに処理速度が落ちると書かれているが、自分の環境では確認できなかった。正確に測定したわけではないが、目視上映像にカクつきはなく、それどころか映像が画面に表示されるまでの時間がcv2.CAP_DSHOWを指定した場合には劇的に改善した(指定なしの場合は実行してから映像が表示されるまで30秒くらいかかる)。
記事を書かれた方はC++版のOpenCVを使っているため環境が異なるが、Windows10、Python 3.7.4、OpenCV4.2.0では上記結果となった。

madeinpc.blog.fc2.com