2024年4月21日日曜日

【OpenCV】VideoCapture()によるカメラからの画像・動画撮影

 画像処理ライブラリOpenCVでカメラによる画像・動画撮影を行う場合VideoCapture()を使う。


OpenCVを使うにはインポートが必要。

import cv2



1. カメラによる画像撮影

 PC等デバイスに接続されているカメラを使用する場合、始めにcv2.VideoCapture()の引数にデバイス番号を与え、VideoCaptureオブジェクトを生成する。PCに接続しているカメラが1台の場合通常、デバイス番号は0となる。カメラから画像を読み出す場合、生成したVideoCaptureオブジェクトに対してread()を使う。戻り値はretval, imageの2つ。retvalには画像が取得できたかどうかが返され、戻り値はTrue,Falseとなる。imageには取得した画像が返される。

 デバイス番号0を指定しPCのカメラでVideoCaptureオブジェクトを生成、read()で画像を習得し、imwrite()で画像を保存する例。cap.release()VideoCaptureオブジェクトのメモリを開放している。

import cv2

cap = cv2.VideoCapture(0)
retval, image = cap.read()

cv2.imwrite('capture.png', image)

cap.release()


 カメラのフレームレート、画像サイズを取得するには、生成したVideoCaptureオブジェクトに対して、get()を適用する。get()の引数をcv2.CAP_PROP_FPSとすることでフレームレート、cv2.CAP_PROP_FRAME_WIDTHとすることで画像幅、cv2.CAP_PROP_FRAME_HEIGHTとすることで画像高さが取得できる

import cv2

cap = cv2.VideoCapture(0)

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

print(fps, width, height)

 実行結果

30.0 640 480


2. カメラによる動画撮影

 カメラから動画を取得して保存する場合、VideoCapture()で取得した画像をVideoWriterオブジェクトに逐次追加する。この際に保存する動画サイズを取得画像と揃える必要がある。
次の例では
VideoCaptureオブジェクトcapの生成
②capのフレームレート、画像幅、高さの取得
VideoWriterオブジェクトoutの生成(コーデックmp4vを指定、フレームレート、画像幅、高さはcapと同じとする)
④capの読み出し、outへの書き込みを100回繰り返す
⑤cap,outのリリース
の手順でカメラから動画を撮影している。なお、cap.getによって取得した画像幅、高さはfloat型のためVideoWriterオブジェクトと幅、高さ指定の際にはint()で整数型に変更する。

import cv2

cap = cv2.VideoCapture(0)

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

fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 
out = cv2.VideoWriter('video.mp4', fourcc, fps, (int(width), int(height))) 

for i in range(100):
    retval, image = cap.read()
    out.write(image)

cap.release()
out.release()     


3. リファレンス

OpenCV > VideoCapture Class Reference > VideoCapture()
OpenCV > VideoCapture Class Reference > VideoCaptureProperties
OpenCV > VideoCapture Class Reference > read()
OpenCV > VideoCapture Class Reference > release()

使用したバージョン:Python 3.10.4 / OpenCV 4.9.0

【Numpy】numpy.T/numpy.transpose/ndarray.transposeによる二次元行列の転置

 Pythonの数値計算ライブラリNumPyの配列型データ構造であるndarrayを転置(行と列の入れ替え)する場合、numpy.Tnumpy.transposeまたはndarray.transposeを用いる。

Numpyを使う際にはimportが必要。しばしばnpと略さてインポートされる。

import numpy as np



1. numpy.T属性、numpy.transposeメソッド、ndarray.transpose関数による二次元ndarrayの転置

 二次元ndarrayに対してnumpy.T属性をとると、行と列が入れ替わった転置行列が返される。
2行3列のndarrayのnumpy.T属性を取り転置行列を得る例。

import numpy as np

a = np.array([[-1, 2, 5], [3, 1, 7]])
a.T

実行結果

array([[-1,  3],
       [ 2,  1],
       [ 5,  7]])


 numpy.transpose()により同様の転置操作ができる。

import numpy as np

a = np.array([[-1, 2, 5], [3, 1, 7]])
np.transpose(a)

実行結果

array([[-1,  3],
       [ 2,  1],
       [ 5,  7]])


 また、ndarray.transpose()でも同様の転置操作ができる。

import numpy as np

a = np.array([[-1, 2, 5], [3, 1, 7]])
a.transpose()

実行結果

array([[-1,  3],
       [ 2,  1],
       [ 5,  7]])


2. リファレンス

NumPy > numpy.ndarray.T
NumPy > numpy.transpose
NumPy > numpy.ndarray.transpose

使用バージョン:Python 3.10.4/numpy 1.26.4

2023年10月9日月曜日

【リスト】リストの最大値・最小値・インデックス取得

 関数max,minによりリスト内要素の最大値、最小値が求められる。またメソッドindexにより最大値、最小値のインデックスを取得できる。


1. max,minによるリスト内要素の最大値、最小値取得

 関数max,minにより、リスト内要素の最大値、最小値が求められる。

x = [3, 67, 1, 8, -5, 22]

max(x)

実行結果

67


x = [3, 67, 1, 8, -5, 22]

min(x)

実行結果

-5


2. indexによるリスト最大値、最小値のインデックス取得

 メソッドindexを用いることで最大値、最小値のインデックスを取得できる。
次の例では最大値67はリストの2番目つまりインデックス1、最小値-5はリストの5番目つまりインデックス4である。

x = [3, 67, 1, 8, -5, 22]

x.index(max(x))

実行結果

1


x = [3, 67, 1, 8, -5, 22]

x.index(min(x))

実行結果

4


3. リファレンス

Python チュートリアル > 3. 形式ばらない Python の紹介 > 3.1.3. リスト型 (list)
Python チュートリアル > 5. データ構造 > 5.1. リスト型についてもう少し
Python 標準ライブラリ > 組み込み関数 > max(iterable, *, key=None)
Python 標準ライブラリ > 組み込み関数 > min(iterable, *, key=None)

使用バージョン:Python 3.10.4

2023年1月25日水曜日

【PyAutoGUI】マウス操作

 Pythonによるマウスやキーボード操作を可能にしRPAに役立つライブラリPyAutoGUIでのマウス操作方法を解説する。

 PyAutoGUIを使うためには以下のようにインポートが必要。

import pyautogui


1. 画面サイズとマウス現在位置の取得

 画面サイズを取得するにはpyautogui.size()を用いる。引数は不要。

import pyautogui

pyautogui.size()

 実行結果

Size(width=1920, height=1080)


 2つの変数で受ければ画面の幅、高さの値をそれぞれ取得できる。

import pyautogui

x, y = pyautogui.size()
print(x, y)

 実行結果

1920 1080


 マウスの現在位置を取得するにはpyautogui.position()を用いる。引数は不要。

import pyautogui

pyautogui.position()

 実行結果

Point(x=606, y=190)


 2つの変数で受ければマウスのx座標、y座標をそれぞれ取得できる。

import pyautogui

x, y = pyautogui.position()
print(x, y)

 実行結果

600 189


2. moveToによる指定座標へのマウス移動

 マウスを任意の座標に動かすにはmoveTo()を用いる。引数には移動先の座標(x, y)を与える。次の例ではマウスカーソルがx100, y500に移動する。

import pyautogui

pyautogui.moveTo(100, 500)


 移動先の座標のみ指定した場合、実行直後に指定座標にカーソルが移動する。通常のマウス操作のようにカーソルを動かしたい場合、引数に移動時間(秒数)durationを指定する。書式は(x, y, duration)。次の例ではマウスカーソルがx100, y500に2秒かけて移動する。

import pyautogui

pyautogui.moveTo(100, 500, 2)


3. moveによる現在座標を基準にしたマウス移動

 現在位置を基準にしてマウスを動かすにはmove()を用いる。引数には移動するピクセル数(x, y)を与える。次の例ではマウスカーソルが現在位置から左に50, 下に200、1秒かけて移動する。

import pyautogui

pyautogui.move(-50, 200, 1)


4. dragTo、dragによるマウスドラッグ

 指定座標へマウスをドラッグするにはdragTo()を用いる。引数は(x, y, dulation, button)buttonはドラッグ中に押すマウスボタンの指定で値は'left', 'middle', 'right'のいずれか。次の例ではx1800, y700の座標に1秒かけて左ボタンを押しながらドラッグする。

import pyautogui

pyautogui.dragTo(1800, 700, 1, button='left')


 現在位置を基準にしてマウスをドラッグするにはdrag()を用いる。引数は(x, y, dulation, button)。次の例では現在位置から右に400, 上に100、2秒かけて右ボタンを押しながらドラッグする。

import pyautogui

pyautogui.drag(400, -100, 2, button='right')


5. clickによるマウスクリック

 マウスクリックはclick()を使う。次のように引数が無い場合は左クリックになる。

import pyautogui

pyautogui.click()


 クリックする座標を指定すると、指定座標に移動してからクリック動作を行う。x200, y100に移動してから左クリックする例。

import pyautogui

pyautogui.click(200, 100)


 引数buttonに'left', 'middle', 'right'いずれかを指定することで任意のボタンでクリックする。右クリックの例。

import pyautogui

pyautogui.click(button='right')


引数clicksによりクリック回数を指定できる。ダブルクリック(2回クリック)の例。

import pyautogui

pyautogui.click(clicks=2)


引数intervalにより複数回クリックする際の間隔を指定できる。0.25秒間隔をあけてダブルクリックする例。

import pyautogui

pyautogui.click(clicks=2, interval=0.25)


左ボタンによるダブルクリックはdoubleClick()でも実現可能。

import pyautogui

pyautogui.doubleClick()


マウスのクリック動作はボタンを押す動作と離す動作に分割できる。mouseDown()でボタンを押す動作、mouseUp()でボタンを離す動作を個別に実行できる。左ボタンのクリック動作の例。

import pyautogui

pyautogui.mouseDown()
pyautogui.mouseUp()


6. scrollによるマウスホイールのスクロール

 scroll()によりマウスホイールのスクロール動作が行える。引数にclicksとしてスクロール量に応じた「クリック数」を整数で指定する。ホイールを前に回す場合は正、ホイールを手前に回す場合は負の数にする。clicksを1000とした場合。1000ピクセル分画面が上にスクロールする(Windows10)

import pyautogui

pyautogui.scroll(1000, x=110, y=500)


 引数にx, yを指定すると、指定した座標(x, y)に移動してからスクロール動作する。座標(1200, 500)に移動してから手前に500クリック分スクロールする例。

import pyautogui

pyautogui.scroll(-500, x=1200, y=500)


7. リファレンス

PyAutoGUI > Docs > Mouse Control Functions

使用バージョン:Python 3.10.4 / PyAutoGUI 0.9.53

2023年1月22日日曜日

【PyAutoGUI】screenshotによるスクリーンショットの取得

 Pythonによるマウスやキーボード操作を可能にしRPAに役立つライブラリPyAutoGUIのscreenshotにより画面のスクリーンショットを取得できる。

 PyAutoGUIを使うためには以下のようにインポートが必要。

import pyautogui


1. screenshotの使用例

 引数を指定しない場合、全画面のスクリーンショットを取得する。

import pyautogui

im = pyautogui.screenshot()

 スクリーンショットはPillow(PIL)Imageオブジェクト、RGBカラーモードで取得される。

import pyautogui

im = pyautogui.screenshot()

print(type(im))
print(im.size, im.mode)

 実行結果

<class 'PIL.Image.Image'>
(1920, 1080) RGB


 引数にファイル名を指定すると取得したスクリーンショットが画像ファイルとして保存される。

import pyautogui

im = pyautogui.screenshot('screenshot.jpg')


 引数に座標regionを指定すると指定した範囲のみスクリーンショットを取得する。座標は(左上x座標, 左上y座標, 右下x座標, 右下y座標)のタプルで指定する。

import pyautogui

im = pyautogui.screenshot('screenshot.jpg', (0,0, 600, 400))


2. リファレンス

PyAutoGUI > Docs > Screenshot Functions

使用バージョン:Python 3.10.4 / PyAutoGUI 0.9.53

2023年1月5日木曜日

【Pillow】ImageGrabモジュールによるスクリーンショットの取得

 画像処理ライブラリPillowのImageGrab.grabにより画面のスクリーンショットを取得できる。

 Pillow(PIL)を使うためにはインポートが必要。PIL.ImageGrabモジュールは通常以下の形式でインポートされる。

from PIL import ImageGrab


1. ImageGrab.grabの書式

 ImageGrab.grabの書式は以下。

PIL.ImageGrab.grab(bbox=None, 
                   include_layered_windows=False, 
                   all_screens=False, 
                   xdisplay=None)

2. ImageGrab.grabの使用例

 引数を指定しない場合、全画面のスクリーンショットを取得する。全画面のスクリーンショットをファイルに保存する例。

from PIL import ImageGrab, Image

im = ImageGrab.grab()
im.save('grab.jpg')



 スクリーンショットの範囲を指定する場合、引数に(x1, y1, x2, y2)のタプルを与える。左上隅から幅400ピクセル、高さ300ピクセルでスクリーンショットを取得する例。

from PIL import ImageGrab, Image

im = ImageGrab.grab((0, 0, 400, 300))
im.save('grab.jpg')



3. リファレンス

Pillow (PIL Fork) > ImageGrab Module > PIL.ImageGrab.grab

使用バージョン:Python 3.10.4 / Pillow 9.1.0

2022年5月15日日曜日

【pandas】value_countによる出現頻度の算出

 データ分析用ライブラリpandasの1次元のデータ構造Seriesと2次元のデータ構造Dataframeについて、要素の出現回数を算出するにはvalue_countを用いる。

 ライブラリpandasを使うにはインポートが必要。通常次のようにpdと略されてインポートされる。

import pandas as pd



1. value_countによるSeriesの並べ替え

 Series.value_count()の書式は以下の通り。

Series.value_counts(normalize=False, 
                    sort=True, 
                    ascending=False, 
                    bins=None, 
                    dropna=True)

引数 意味
normalize 頻度を正規化(合計1に)するか。デフォルトはFalse
sort 頻度順に並べるか。デフォルトはTrue
ascending 昇順に並べるか。デフォルトはFalse
bins 区画幅の指定。デフォルトはFalse
dropna NaNを含めない。デフォルトはTrue


 引数を指定しない場合。各要素が頻度の多い順に並べられ出現回数がカウントされる。ser.value_counts()Series型。

import pandas as pd

ser = pd.Series([7, 5, 8, 2, 4, 7, 8, 8, 2, 2, 3, 8])
print(ser.value_counts())

 実行結果

8    4
2    3
7    2
5    1
4    1
3    1
dtype: int64


 normalize=Trueの場合。頻度が正規化される。

import pandas as pd

ser = pd.Series([7, 5, 8, 2, 4, 7, 8, 8, 2, 2, 3, 8])
print(ser.value_counts(normalize=True))

 実行結果

8    0.333333
2    0.250000
7    0.166667
5    0.083333
4    0.083333
3    0.083333
dtype: float64


 sort=Falseの場合。出現回数順にソートされない。

import pandas as pd

ser = pd.Series([7, 5, 8, 2, 4, 7, 8, 8, 2, 2, 3, 8])
print(ser.value_counts(sort=False))

 実行結果

7    2
5    1
8    4
2    3
4    1
3    1
dtype: int64


 ascending=Trueの場合。頻度の昇順(少ない順)に並べられる。

import pandas as pd

ser = pd.Series([7, 5, 8, 2, 4, 7, 8, 8, 2, 2, 3, 8])
print(ser.value_counts(ascending=True))

 実行結果

5    1
4    1
3    1
7    2
2    3
8    4
dtype: int64


 binsを指定する場合。要素が数字の場合に指定した区間数にグループ化され、グループ毎の出現回数が求まる。
bins=3を指定する例。3区間に分けられる。

import pandas as pd

ser = pd.Series([7, 5, 8, 2, 4, 7, 8, 8, 2, 2, 3, 8])
print(ser.value_counts(bins=3))

 実行結果

(6.0, 8.0]      6
(1.993, 4.0]    5
(4.0, 6.0]      1
dtype: int64


2. value_countによるDataframeの並べ替え

 Dataframeで要素の出現回数を求める場合もvalue_countsを用いる。

Dataframe.value_count()の書式は以下の通り。

Dataframe.value_counts(subset=None,
                       normalize=False, 
                       sort=True, 
                       ascending=False, 
                       dropna=True)

引数 意味
subset カウントするColumnsの指定。デフォルトはNone
normalize 頻度を正規化(合計1に)するか。デフォルトはFalse
sort 頻度順に並べるか。デフォルトはTrue
ascending 昇順に並べるか。デフォルトはFalse
dropna NaNを含めない。デフォルトはTrue


 引数を指定しない場合。2つのColumnsの組み合わせの出現回数が求められる。

df = pd.DataFrame(
    data = [['赤', '野菜'], 
            ['緑', '野菜'],
            ['赤', '果物'],
            ['黄', '果物'],
            ['緑', '野菜']],
    columns = ['色', '種類'],
    index = ['トマト', 'きゅうり', 'イチゴ', 'バナナ', 'キャベツ']
    )

print(df.value_counts())

 実行結果

色  種類
緑  野菜    2
赤  果物    1
   野菜    1
黄  果物    1
dtype: int64


 Columnsを指定する場合。指定した列の要素の出現回数が求まる。

df = pd.DataFrame(
    data = [['赤', '野菜'], 
            ['緑', '野菜'],
            ['赤', '果物'],
            ['黄', '果物'],
            ['緑', '野菜']],
    columns = ['色', '種類'],
    index = ['トマト', 'きゅうり', 'イチゴ', 'バナナ', 'キャベツ']
    )

print(df.value_counts(subset='種類'))

 実行結果

種類
野菜    3
果物    2
dtype: int64


3. リファレンス

pandas > pandas.Series.value_counts
pandas > pandas.DataFrame.value_counts

使用したバージョン:Python 3.8.12/pandas 1.4.0