nyanpyou Note

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

学びのメモ2

eval()関数を使うと、文字列をPythonコードとして評価できる。これを使うと実行したいメソッドを文字列の結合から作ることが出来る。オブジェクトは同じだけど、メソッド部分だけどんどん入れ替えたい場合などに使える。

#例
class Test:
    def printOK(self):
        print("OK")
    def printNO(self):
        print("NO")

test = Test()
ok = "test." + "printOK"
no = "test." + "printNO"
eval(ok)()
>>OK
eval(no)()
>>NO

time.time()を用いると経過時間の計測ができるが、公式によると1秒以下の精度をいつでも保証できるわけではないらしい。より精度を上げた測定がしたい場合は、time.perf_time()を用いると良い。

hibiki-press.tech


webページ中の特定の場所に飛ぶURLを作りたい場合は、ブラウザでソースを表示して飛ばしたい場所のidを確認し、

http://~~~#id名

とすると作れる。


numpyの配列に対して、.max()と.min()で配列中の最大値と最小値を取得できる。

import numpy as np
test = np.array([0, 250, 100, 600, 10])
print(test.max())
>>600
print(test.min())
>>0

次元を2次元、3次元と増やした場合でも、配列中に存在する数値全てを対象として最大値と最小値を表示してくれるようだ。


画像に対してcv2.inRange()を使うと、ある特定の色の範囲だけを取り出して二値化できる。また、cv2.cvtColor()はBGR空間をHSV空間に変換することもできる。
HSV空間とはHue(色相)、Saturation(彩度)、Value(明度)の三つの成分で表される空間。
OpenCVにおいて、Hueは[0,179], Saturationは[0,255],Valueは[0,255]。

import cv2
import numpy as np

image = cv2.imread("test.jpg")
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

lower = np.array([50,50,50])
upper = np.array([100,100,100])

binary_image = cv2.imRange(hsv, lower, upper)

labs.eecs.tottori-u.ac.jp


OpenCVにもビット演算の関数が備わっている。例えばマスク画像を使って元画像を抜き出したい場合は、以下のようになる。

import cv2
image = cv2.imread("test.jpg")
mask_img = 適当な二値化済みのマスク画像
#マスク画像の形に抜き出した画像を作る
masked_img = cv2.bitwise_and(image, image, mask=mask_img)

cv2.setMouseCallback()を使うと、OpenCVでimshowした画像に対してマウスイベントを設定できる。例えば以下のようにすると、画像をクリックするたびにHello!とコンソールに出力できる。マウスイベントに設定された関数には呼び出し時の(x,y)座標などが渡される。cv2.setMouseCallback()を再度実行することで、設定するマウスイベントを切り替えることが可能。

import cv2

#Hello!を表示する関数
def hello(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print("Hello!")

image = cv2.imread("test.jpg")
cv2.namedWindow("hello")
cv2.setMouseCallback("hello", hello)
cv2.imshow("hello", image)
k = cv2.waitKey(1)&0xFF
if k == ord("q"):
    cv2.destroyAllWindows()