前回の記事で使用したライブラリについてまとめました
顔認識で必要なものはおおむね揃っているので、目次を使いながら活用してみてください!
目次
- 1 cv2.(opencvライブラリ)
- 1.1 cv2.imwrite()
- 1.2 cv2.imshow()
- 1.3 cv2.destroyAllWindows()
- 1.4 cv2.waitKey()
- 1.5 cv2.flip()
- 1.6 cv2.FONT_HERSHEY_SIMPLEX
- 1.7 cv2.putText()
- 1.8 cv2.rectangle()
- 1.9 VideoCaptureクラス (camインスタンスを生成)
- 1.10 cam.release()
- 1.11 cam.set()
- 1.12 cam.read()
- 1.13 cam.get()
- 1.14 CascadeClassifier(クラス)
- 1.15 detectMultiScale()
- 2 os(osモジュール)
- 3 PIL
- 4 LBPHFaceRecognierクラス(recognizerインスタンスを生成)
- 5 参考サイト一覧
cv2.(opencvライブラリ)
1 |
import cv2 |
cv2.imwrite()
cv2.imwrite(path, img)
画像保存の関数
第1引数は画像のファイル名、第2引数は保存したい画像
cv2.imshow()
cv2.imshow('Image',img)
第1引数は文字列型で指定するウィンドウ名、第2引数は表示したい画像
cv2.destroyAllWindows()
現在までに作られた全てのウィンドウを閉じる関数
cv2.waitKey()
キーボード入力を処理する関数
引数は入力待ち時間でミリ秒単位で指定
引数に 0 を指定した時は,何かしらのキーを打つまでキー入力を無期限で待ち続ける
例 cv2.waitKey(100) キーボードが入力されるまで100ミリ秒待つ
cv2.flip()
cv2.flip(src, flipCode[, dst])
画像データを操作
- 0: x軸を中心に反転(ようするに上下反転)
- 正の値: y軸を中心に反転(ようするに左右反転)
- 負の値: x軸y軸両方の反転
cv2.FONT_HERSHEY_SIMPLEX
フォントを指定する関数
他にもPLAIN、DUPLEX、COMPLEXなど様々なフォントがある
cv2.putText()
cv.putText(img, text, org, fontFace, fontScale, color, thickness=1, lineType=cv2.LINE_8)
テキストを描画する関数
- text:描画する文字列
- org:文字列の左下座標
- fontFace:フォントの種類
- fontScale:縮尺(1.0が標準)
cv2.rectangle()
長方形を描画する関数
cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)
- img:図形を描画する画像、NumPyの配列ndarray
- pt1,pt2:線の両端の座標や円の中心などを(x, y)で指定する。単位はピクセル、原点は左上
- color:カラー画像、BGRの場合は(Blue, Green, Red)
- thickness:線の太さ
- lineType:「4連結: cv2.LINE_4」、「8連結: cv2.LINE_8」、「アンチエイリアス: cv2.LINE_AA」の3つから選択
- shift:座標の小数部分のビット数を整数で指定する デフォルトは0
shiftを指定すると、座標が(x2^(-shift), y2^(-shift))として計算される。
例えば、座標を(100, 101)でshift=1とすると、実際に描画に用いられる座標は(50, 50.5)となり、サブピクセル精度で座標を指定することができる。
VideoCaptureクラス (camインスタンスを生成)
動画ファイルを読み込む
1 |
cam=cv2.VideoCapture(0) |
としてcamインスタンスを生成する
0はカメラを識別する番号(実際はなんでもよい)
cam.release()
動画データを開放する
cam.set()
cam.set(propId, value)
取得画像の設定を変える
- propid:0~10の値(3は横幅、4は高さを変更できる)
- value:変えたい値
例 cam.set(3, 640)→横幅を640ピクセルに
cam.read()
読み込み
2値の値(True,False)を返す
読み込みが正しければTrue、失敗したらFalse
戻り値(<True or False>, <イメージデータ>)
cam.get()
cam.get(int property_id)
ビデオキャプチャのフレームに関する値が返ってくる
property_idに数字を指定して設定をする
例
- 3ビデオストリーム中のフレームの幅
- 4 ビデオストリーム中のフレームの高さ
CascadeClassifier(クラス)
物体検出のためのクラス
1 |
detector = cv2.CascadeClassifier |
としてdetectorインスタンスを生成する
detectMultiScale()
detectMultiScale(const Mat& image, vector& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size())
検出領域の(左上の点のx座標, y座標, 幅, 高さ)のリスト(配列)をかえす
- image:画像データ.ここに格納されている画像中から物体が検出される
- objects:矩形を要素とするベクトル.それぞれの矩形は,検出した物体を含む
- scaleFactor:各画像スケールにおける縮小量を表す
- minNeighbors:物体候補となる矩形は,最低でもこの数だけの近傍矩形を含む必要がある
例 detector.detectMultiScale(gray, 1.3, 5)
(grayという画像から認識、スケールをどうするか、矩形に何個入れば真か)
スケールを細かく変更して検出ると、見落としは少ないが処理時間がかかる。
os(osモジュール)
1 |
import os |
OSに依存しているさまざまな機能を利用できるモジュールで、主にファイルやパスの操作が可能
os path join()
パス名操作に関する処理をまとめたモジュールに実装されている関数の一つ
引数に与えられた二つの文字列を結合させ、一つのパスにする事ができる
1 2 3 4 5 6 |
例 #! /usr/bin/env python import os print("join(): " + os.path.join("/A/B/C", "file.py")) 結果 join(): /A/B/C/file.py |
os.listdir()
ファイル・ディレクトリの一覧を取得
「datasets」の下に'dir1', 'dir2', 'file1', 'file2.txt', 'file3.jpg' というディレクトリとファイルがあるとする。
1 2 3 4 5 6 7 8 |
例 path = "datasets" files = os.listdir(path) print(files) 結果 ['dir1', 'dir2', 'file1', 'file2.txt', 'file3.jpg'] |
os.path.split()
os.path.split(path)
path を (head, tail) に分割
tail はパス名の構成要素の末尾(通常はファイル名)で,head はそれより前の部分
1 2 3 4 5 6 7 8 9 10 11 12 13 |
例 name='Face-Recognition/dataSet/face-1.1.jpg' In [1]: os.path.split(name) Out[1]: ('Face-Recognition/dataSet', 'face-1.1.jpg') In [2]: os.path.split(name)[-1] Out[2]: 'face-1.1.jpg' In [3]: os.path.split(name)[-1].split('.') Out[3]: ['face-1', '1', 'jpg'] In [4]: os.path.split(name)[-1].split('.')[1] Out[4]: '1' In [5]: int(os.path.split(name)[-1].split('.')[1]) Out[5]: 1 |
PIL
1 |
import pillow |
画像処理用のライブラリ
Image.open()
Image.open(画像ファイルのあるパス)
画像の読み込み
Image.convert()
引数にLを指定することで白黒画像で読み込める
1 2 |
例 PIL_img = Image.open(imagePath).convert('L') |
パスから画像を読み込み、白黒画像に変換している
LBPHFaceRecognierクラス(recognizerインスタンスを生成)
Local Binary Patternを識別するためのクラス
1 |
recognizer = cv2.face.LBPHFaceRecognizer_create() |
recognizerインスタンスを生成
recognizer.train()
.train (InputArrayOfArrays src(画像データ), InputArray labels)=0
与えられた画像データから訓練をするメソッド
recognizer.train()
.write (const String &filename) const
識別機を指定したパスに保存する
recognizer.predict()
戻り値 label 、confidence
- label :与えられた画像から予測したラベル
- confidence:確度
確度は、分散に基づいて計算されるため、0に近いほうが確度が高くなる
参考サイト一覧
Python, OpenCVで図形描画(線、長方形、円、矢印、文字など)